summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-03-19 00:18:59 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-03-19 00:28:52 +0900
commit75c374cad330e2c99ceb7e1ca083523a7651e753 (patch)
tree2140cc635cc0a10da53ba515279b535ee333ebb9 /src/vm.c
parent6db38c376880651b76263b16788c36c6c9ea3aef (diff)
downloadmruby-75c374cad330e2c99ceb7e1ca083523a7651e753.tar.gz
mruby-75c374cad330e2c99ceb7e1ca083523a7651e753.zip
Update stack only when callinfo is popped; fix #3521
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c8
1 files changed, 5 insertions, 3 deletions
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 {