diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-03-19 00:18:59 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-03-19 00:28:52 +0900 |
| commit | 75c374cad330e2c99ceb7e1ca083523a7651e753 (patch) | |
| tree | 2140cc635cc0a10da53ba515279b535ee333ebb9 /src | |
| parent | 6db38c376880651b76263b16788c36c6c9ea3aef (diff) | |
| download | mruby-75c374cad330e2c99ceb7e1ca083523a7651e753.tar.gz mruby-75c374cad330e2c99ceb7e1ca083523a7651e753.zip | |
Update stack only when callinfo is popped; fix #3521
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -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 { |
