diff options
| -rw-r--r-- | src/parse.y | 3 | ||||
| -rw-r--r-- | src/vm.c | 12 |
2 files changed, 10 insertions, 5 deletions
diff --git a/src/parse.y b/src/parse.y index ff5df7822..336b20a6c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -274,7 +274,8 @@ local_add(parser_state *p, mrb_sym sym) static node* new_scope(parser_state *p, node *body) { - return cons((node*)NODE_SCOPE, cons(p->locals->car, body)); + node *n = p->locals ? p->locals->car : NULL; + return cons((node*)NODE_SCOPE, cons(n, body)); } /* (:begin prog...) */ @@ -1222,6 +1222,13 @@ RETRY_TRY_BLOCK: int a = GETARG_A(i); int n = GETARG_C(i); + if (mid == 0) { + mrb_value exc; + out_super: + exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method"); + mrb->exc = mrb_obj_ptr(exc); + goto L_RAISE; + } recv = regs[0]; c = mrb->c->ci->target_class->super; m = mrb_method_search_vm(mrb, &c, mid); @@ -1306,10 +1313,7 @@ RETRY_TRY_BLOCK: else { struct REnv *e = uvenv(mrb, lv-1); if (!e) { - mrb_value exc; - exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method"); - mrb->exc = mrb_obj_ptr(exc); - goto L_RAISE; + goto out_super; } stack = e->stack + 1; } |
