summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-12 01:24:11 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-12 01:24:11 +0900
commit6247eafc7167d5f18a5dae4d7508be06c370c1f9 (patch)
tree4d5ef23fd07b6d59259c8f2eaae8d4c0f23fe44a
parent13a542d48d5d86b866dbc4d6a4f0ec17bee49c12 (diff)
downloadmruby-6247eafc7167d5f18a5dae4d7508be06c370c1f9.tar.gz
mruby-6247eafc7167d5f18a5dae4d7508be06c370c1f9.zip
should raise error on top-level super/yield
-rw-r--r--src/vm.c11
1 files changed, 11 insertions, 0 deletions
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];