From 82ab46139e6ee6bf664a5772cd83c37ed3bc17fe Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 18 Apr 2017 10:23:30 +0900 Subject: Add "no super" check to OP_ARGARY; fix #3610 --- src/vm.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vm.c b/src/vm.c index 331ea3c3c..d26189ac9 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1514,16 +1514,17 @@ RETRY_TRY_BLOCK: int lv = (bx>>0)&0xf; mrb_value *stack; + if (mrb->c->ci->mid == 0 || mrb->c->ci->target_class == NULL) { + mrb_value exc; + + L_NOSUPER: + exc = mrb_exc_new_str_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method"); + mrb_exc_set(mrb, exc); + } if (lv == 0) stack = regs + 1; 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_set(mrb, exc); - goto L_RAISE; - } + if (!e) goto L_NOSUPER; stack = e->stack + 1; } if (r == 0) { -- cgit v1.2.3