diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-07 00:44:08 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-07 00:44:08 +0900 |
| commit | 6c299aae67e2e0f13a470b855298bc1efb43387a (patch) | |
| tree | 4a3509d41c78f428da55e3b4aa966793d624d8d7 | |
| parent | 0b8d8dd379fc5df137477019f0ae355d7a01735f (diff) | |
| download | mruby-6c299aae67e2e0f13a470b855298bc1efb43387a.tar.gz mruby-6c299aae67e2e0f13a470b855298bc1efb43387a.zip | |
fixed wrong stack adjustment for ensure clauses; fix #3175
| -rw-r--r-- | src/vm.c | 3 | ||||
| -rw-r--r-- | test/t/exception.rb | 5 |
2 files changed, 7 insertions, 1 deletions
@@ -1513,6 +1513,7 @@ RETRY_TRY_BLOCK: /* A B return R(A) (B=normal,in-block return/break) */ if (mrb->exc) { mrb_callinfo *ci; + mrb_value *stk; int eidx; L_RAISE: @@ -1524,6 +1525,7 @@ RETRY_TRY_BLOCK: if (ci->ridx == 0) goto L_STOP; goto L_RESCUE; } + stk = mrb->c->stack; while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); ci = mrb->c->ci; @@ -1533,6 +1535,7 @@ RETRY_TRY_BLOCK: MRB_THROW(prev_jmp); } if (ci == mrb->c->cibase) { + mrb->c->stack = stk; while (eidx > 0) { ecall(mrb, --eidx); } diff --git a/test/t/exception.rb b/test/t/exception.rb index 839250ea8..2dc8f5487 100644 --- a/test/t/exception.rb +++ b/test/t/exception.rb @@ -338,10 +338,13 @@ assert('Exception 19') do begin 1 * "b" ensure - @e = self.z + @e = self.zz end end + def zz + true + end def z true end |
