summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/load.c14
-rw-r--r--src/parse.y24
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) */