From 6247eafc7167d5f18a5dae4d7508be06c370c1f9 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Tue, 12 Jun 2012 01:24:11 +0900 Subject: should raise error on top-level super/yield --- src/vm.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/vm.c b/src/vm.c index 5a521c357..c449a9b3c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -886,6 +886,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (lv == 0) stack = regs + 1; else { struct REnv *e = uvenv(mrb, lv-1); + if (!e) { + mrb_value exc; + const char *m = "super called outside of method"; + exc = mrb_exc_new(mrb, E_NOMETHOD_ERROR, m, strlen(m)); + mrb->exc = (struct RObject*)mrb_object(exc); + goto L_RAISE; + } stack = e->stack + 1; } if (r == 0) { @@ -1140,6 +1147,10 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (lv == 0) stack = regs + 1; else { struct REnv *e = uvenv(mrb, lv-1); + if (!e) { + localjump_error(mrb, "yield"); + goto L_RAISE; + } stack = e->stack + 1; } regs[a] = stack[m1+r+m2]; -- cgit v1.2.3