From c633f32b4151e372d96fdbb29eda13103ea56e45 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 22 Apr 2013 11:49:10 +0900 Subject: should call ensure before popping callinfo; cancel 8ce1ea84 --- src/vm.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'src/vm.c') diff --git a/src/vm.c b/src/vm.c index fb1a4dde2..d9f2d6d8c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -811,7 +811,8 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) int a = GETARG_A(i); for (n=0; nci->eidx); + ecall(mrb, mrb->ci->eidx-1); + --mrb->ci->eidx; } mrb_gc_arena_restore(mrb, ai); NEXT; @@ -1283,19 +1284,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) /* cannot happen */ break; } + while (eidx > mrb->ci[-1].eidx) { + ecall(mrb, --eidx); + } cipop(mrb); acc = ci->acc; pc = ci->pc; regs = mrb->stack = mrb->stbase + ci->stackidx; - { - int idx = eidx; - while (idx > mrb->ci->eidx) { - mrb_gc_protect(mrb, mrb_obj_value(mrb->ensure[--idx])); - } - } - while (eidx > mrb->ci->eidx) { - ecall(mrb, --eidx); - } if (acc < 0) { mrb->jmp = prev_jmp; return v; -- cgit v1.2.3