diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-04-27 00:53:08 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-04-27 00:53:08 +0900 |
| commit | bdb9d4d19c3120666aae2ae24602f2d5dec19bbd (patch) | |
| tree | fd5cad5b08d60d92ca02f26e965bc4ca22c33024 /src/vm.c | |
| parent | b3b6fe3c073199dd201b95b76e0a99fcda80cdd9 (diff) | |
| download | mruby-bdb9d4d19c3120666aae2ae24602f2d5dec19bbd.tar.gz mruby-bdb9d4d19c3120666aae2ae24602f2d5dec19bbd.zip | |
super should not be called outside of a method; fix #2770
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -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; } |
