From d0a7e01d9cc97651ec80012fefa7cf1e378adbce Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 21 Jun 2017 02:51:55 +0900 Subject: Should call `ecall()` before callinfo adjustment; fix #3715 --- src/vm.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 324a90a41..43663012e 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1989,21 +1989,18 @@ RETRY_TRY_BLOCK: if (!proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) { goto L_BREAK_ERROR; } + while (mrb->c->eidx > mrb->c->ci->epos) { + ecall(mrb, --mrb->c->eidx); + } /* break from fiber block */ if (mrb->c->ci == mrb->c->cibase && mrb->c->ci->pc) { struct mrb_context *c = mrb->c; - while (mrb->c->eidx > 0) { - ecall(mrb, --mrb->c->eidx); - } mrb->c = c->prev; c->prev = NULL; ci = mrb->c->ci; } if (ci->acc < 0) { - while (mrb->c->eidx > mrb->c->ci->epos) { - ecall(mrb, --mrb->c->eidx); - } ARENA_RESTORE(mrb, ai); mrb->c->vmexec = FALSE; mrb->exc = (struct RObject*)break_new(mrb, proc, v); -- cgit v1.2.3