diff options
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 2 | ||||
| -rw-r--r-- | src/class.c | 2 | ||||
| -rw-r--r-- | src/codegen.c | 12 | ||||
| -rw-r--r-- | test/t/module.rb | 2 |
4 files changed, 15 insertions, 3 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 738d64709..8ee651718 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -13,7 +13,7 @@ get_closure_irep(mrb_state *mrb, int level) if (level == 0) { return mrb->c->ci[-1].proc->body.irep; } - + while (--level) { e = (struct REnv*)e->c; if (!e) return NULL; diff --git a/src/class.c b/src/class.c index 2fa02fa87..37ac751a7 100644 --- a/src/class.c +++ b/src/class.c @@ -1944,7 +1944,7 @@ mrb_mod_module_function(mrb_state *mrb, mrb_value mod) int ai; mrb_check_type(mrb, mod, MRB_TT_MODULE); - + mrb_get_args(mrb, "*", &argv, &argc); if(argc == 0) { /* set MODFUNC SCOPE if implemented */ diff --git a/src/codegen.c b/src/codegen.c index 268ecf1e8..48ab63de0 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -85,6 +85,7 @@ static void gen_assignment(codegen_scope *s, node *node, int sp, int val); static void gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val); static void codegen(codegen_scope *s, node *tree, int val); +static void raise_error(codegen_scope *s, const char *msg); static void codegen_error(codegen_scope *s, const char *message) @@ -552,6 +553,10 @@ for_body(codegen_scope *s, node *tree) codegen(s, tree->cdr->car, VAL); /* generate loop-block */ s = scope_new(s->mrb, s, NULL); + if (s == NULL) { + raise_error(prev, "unexpected scope"); + } + push(); /* push for a block parameter */ lp = loop_push(s, LOOP_FOR); @@ -589,6 +594,10 @@ lambda_body(codegen_scope *s, node *tree, int blk) mrb_code c; codegen_scope *parent = s; s = scope_new(s->mrb, s, tree->car); + if (s == NULL) { + raise_error(parent, "unexpected scope"); + } + s->mscope = !blk; if (blk) { @@ -674,6 +683,9 @@ static int scope_body(codegen_scope *s, node *tree, int val) { codegen_scope *scope = scope_new(s->mrb, s, tree->car); + if (scope == NULL) { + raise_error(s, "unexpected scope"); + } codegen(scope, tree->cdr, VAL); if (!s->iseq) { diff --git a/test/t/module.rb b/test/t/module.rb index 2e19f350f..8503cb9fc 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -528,7 +528,7 @@ assert('Module#module_function') do def modfunc; end module_function :modfunc end - + assert_true M.respond_to?(:modfunc) end |
