diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-06-12 01:24:11 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-06-12 01:24:11 +0900 |
| commit | 6247eafc7167d5f18a5dae4d7508be06c370c1f9 (patch) | |
| tree | 4d5ef23fd07b6d59259c8f2eaae8d4c0f23fe44a /src | |
| parent | 13a542d48d5d86b866dbc4d6a4f0ec17bee49c12 (diff) | |
| download | mruby-6247eafc7167d5f18a5dae4d7508be06c370c1f9.tar.gz mruby-6247eafc7167d5f18a5dae4d7508be06c370c1f9.zip | |
should raise error on top-level super/yield
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 11 |
1 files changed, 11 insertions, 0 deletions
@@ -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]; |
