diff options
| -rw-r--r-- | src/load.c | 14 | ||||
| -rw-r--r-- | src/parse.y | 24 |
2 files changed, 21 insertions, 17 deletions
diff --git a/src/load.c b/src/load.c index 93b9efcd4..a9f1641bf 100644 --- a/src/load.c +++ b/src/load.c @@ -660,23 +660,21 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) buf = (uint8_t*)mrb_malloc(mrb, header_size); if (fread(buf, header_size, 1, fp) == 0) { - mrb_free(mrb, buf); - return NULL; + goto irep_exit; } result = read_binary_header(buf, &buf_size, NULL, &flags); - if (result != MRB_DUMP_OK) { - mrb_free(mrb, buf); - return NULL; + if (result != MRB_DUMP_OK || buf_size <= header_size) { + goto irep_exit; } buf = (uint8_t*)mrb_realloc(mrb, buf, buf_size); if (fread(buf+header_size, buf_size-header_size, 1, fp) == 0) { - mrb_free(mrb, buf); - return NULL; + goto irep_exit; } irep = read_irep(mrb, buf, FLAG_SRC_MALLOC); - mrb_free(mrb, buf); +irep_exit: + mrb_free(mrb, buf); return irep; } diff --git a/src/parse.y b/src/parse.y index 336b20a6c..ca2a52861 100644 --- a/src/parse.y +++ b/src/parse.y @@ -201,6 +201,7 @@ parser_strndup(parser_state *p, const char *s, size_t len) b[len] = '\0'; return b; } +#undef strndup #define strndup(s,len) parser_strndup(p, s, len) static char* @@ -270,12 +271,17 @@ local_add(parser_state *p, mrb_sym sym) } } +static node* +locals_node(parser_state *p) +{ + return p->locals ? p->locals->car : NULL; +} + /* (:scope (vars..) (prog...)) */ static node* new_scope(parser_state *p, node *body) { - node *n = p->locals ? p->locals->car : NULL; - return cons((node*)NODE_SCOPE, cons(n, body)); + return cons((node*)NODE_SCOPE, cons(locals_node(p), body)); } /* (:begin prog...) */ @@ -602,35 +608,35 @@ new_undef(parser_state *p, mrb_sym sym) static node* new_class(parser_state *p, node *c, node *s, node *b) { - return list4((node*)NODE_CLASS, c, s, cons(p->locals->car, b)); + return list4((node*)NODE_CLASS, c, s, cons(locals_node(p), b)); } /* (:sclass obj body) */ static node* new_sclass(parser_state *p, node *o, node *b) { - return list3((node*)NODE_SCLASS, o, cons(p->locals->car, b)); + return list3((node*)NODE_SCLASS, o, cons(locals_node(p), b)); } /* (:module module body) */ static node* new_module(parser_state *p, node *m, node *b) { - return list3((node*)NODE_MODULE, m, cons(p->locals->car, b)); + return list3((node*)NODE_MODULE, m, cons(locals_node(p), b)); } /* (:def m lv (arg . body)) */ static node* new_def(parser_state *p, mrb_sym m, node *a, node *b) { - return list5((node*)NODE_DEF, nsym(m), p->locals->car, a, b); + return list5((node*)NODE_DEF, nsym(m), locals_node(p), a, b); } /* (:sdef obj m lv (arg . body)) */ static node* new_sdef(parser_state *p, node *o, mrb_sym m, node *a, node *b) { - return list6((node*)NODE_SDEF, o, nsym(m), p->locals->car, a, b); + return list6((node*)NODE_SDEF, o, nsym(m), locals_node(p), a, b); } /* (:arg . sym) */ @@ -668,14 +674,14 @@ new_block_arg(parser_state *p, node *a) static node* new_block(parser_state *p, node *a, node *b) { - return list4((node*)NODE_BLOCK, p->locals->car, a, b); + return list4((node*)NODE_BLOCK, locals_node(p), a, b); } /* (:lambda arg body) */ static node* new_lambda(parser_state *p, node *a, node *b) { - return list4((node*)NODE_LAMBDA, p->locals->car, a, b); + return list4((node*)NODE_LAMBDA, locals_node(p), a, b); } /* (:asgn lhs rhs) */ |
