From 3a6b6518d66ff0acf11a8163404eb4e9c7bbcf1b Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Thu, 4 Oct 2012 11:30:28 +0900 Subject: should handle exception from Ruby implemented method called from funcall; close #484 --- src/vm.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 924520340..7bf3af9d4 100644 --- a/src/vm.c +++ b/src/vm.c @@ -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); } -- cgit v1.2.3