diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-10-04 11:30:28 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-10-04 11:30:28 +0900 |
| commit | 3a6b6518d66ff0acf11a8163404eb4e9c7bbcf1b (patch) | |
| tree | 26589841e85712d62c9d5de264ac172af979c71f /src/vm.c | |
| parent | 72bcf7ee01cdbf513300b08eb771abdb6aae6fb0 (diff) | |
| download | mruby-3a6b6518d66ff0acf11a8163404eb4e9c7bbcf1b.tar.gz mruby-3a6b6518d66ff0acf11a8163404eb4e9c7bbcf1b.zip | |
should handle exception from Ruby implemented method called from funcall; close #484
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 9 |
1 files changed, 4 insertions, 5 deletions
@@ -455,7 +455,6 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int ai = mrb->arena_idx; jmp_buf *prev_jmp = (jmp_buf *)mrb->jmp; jmp_buf c_jmp; - ptrdiff_t ciidx = mrb->ci - mrb->cibase; #ifdef DIRECT_THREADED static void *optable[] = { @@ -1096,13 +1095,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) ci = mrb->ci; eidx = mrb->ci->eidx; if (ci == mrb->cibase) goto L_STOP; - if (ciidx == ci - mrb->cibase){ - mrb->jmp = prev_jmp; - longjmp(*(jmp_buf*)mrb->jmp, 1); - } while (ci[0].ridx == ci[-1].ridx) { cipop(mrb); ci = mrb->ci; + if (ci[1].acc < 0 && prev_jmp) { + mrb->jmp = prev_jmp; + longjmp(*(jmp_buf*)mrb->jmp, 1); + } while (eidx > mrb->ci->eidx) { ecall(mrb, --eidx); } |
