diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-04-17 02:46:17 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-04-17 02:46:17 -0700 |
| commit | 2d6ff9e82c1df08e99925ced3cac01c785c244c4 (patch) | |
| tree | 9b063196911c27ef79145448b0d9e7d0149b81e5 | |
| parent | 4b24ee189ef5b2190562ce4c67d48c3170bdc2a2 (diff) | |
| parent | 7626508f62b3bafc756e87e97f0fef2d6013b388 (diff) | |
| download | mruby-2d6ff9e82c1df08e99925ced3cac01c785c244c4.tar.gz mruby-2d6ff9e82c1df08e99925ced3cac01c785c244c4.zip | |
Merge pull request #1184 from iij/pr-ensure-on-correct-stack
Rollback stack before executing ensure clause.
| -rw-r--r-- | src/vm.c | 2 | ||||
| -rw-r--r-- | test/t/exception.rb | 27 |
2 files changed, 28 insertions, 1 deletions
@@ -1219,9 +1219,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); ci = mrb->ci; + mrb->stack = mrb->stbase + ci[1].stackidx; if (ci[1].acc < 0 && prev_jmp) { mrb->jmp = prev_jmp; - mrb->stack = mrb->stbase + ci[1].stackidx; longjmp(*(jmp_buf*)mrb->jmp, 1); } while (eidx > mrb->ci->eidx) { diff --git a/test/t/exception.rb b/test/t/exception.rb index d43ce8833..5d46d4632 100644 --- a/test/t/exception.rb +++ b/test/t/exception.rb @@ -315,6 +315,33 @@ assert('Exception 18') do end == 3 end +assert('Exception 19') do + class Class4Exception19 + def a + r = @e = false + begin + b + rescue TypeError + r = self.z + end + [ r, @e ] + end + + def b + begin + 1 * "b" + ensure + @e = self.z + end + end + + def z + true + end + end + Class4Exception19.new.a == [true, true] +end + assert('Exception#inspect without message') do Exception.new.inspect end |
