From 75c374cad330e2c99ceb7e1ca083523a7651e753 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sun, 19 Mar 2017 00:18:59 +0900 Subject: Update stack only when callinfo is popped; fix #3521 --- src/vm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index fdb569ffa..e860cf9fd 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1642,12 +1642,12 @@ RETRY_TRY_BLOCK: CASE(OP_RETURN) { /* A B return R(A) (B=normal,in-block return/break) */ if (mrb->exc) { - mrb_callinfo *ci; + mrb_callinfo *ci, *ci0; mrb_value *stk; int eidx; L_RAISE: - ci = mrb->c->ci; + ci0 = ci = mrb->c->ci; mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "lastpc"), mrb_cptr_value(mrb, pc)); mrb_obj_iv_ifnone(mrb, mrb->exc, mrb_intern_lit(mrb, "ciidx"), mrb_fixnum_value(ci - mrb->c->cibase)); eidx = ci->eidx; @@ -1694,7 +1694,9 @@ RETRY_TRY_BLOCK: irep = proc->body.irep; pool = irep->pool; syms = irep->syms; - mrb->c->stack = ci[1].stackent; + if (ci != ci0) { + mrb->c->stack = ci[1].stackent; + } pc = mrb->c->rescue[--ci->ridx]; } else { -- cgit v1.2.3