diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-20 13:14:01 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-20 13:14:01 +0900 |
| commit | edd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3 (patch) | |
| tree | fafe86dea1118a78736035954251c94f9c27ed4e | |
| parent | 6a0b68f8b81adff8bc9fa58764eb014fa30de1c5 (diff) | |
| download | mruby-edd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3.tar.gz mruby-edd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3.zip | |
Do not raise an exception for living closure; ref #3359
| -rw-r--r-- | src/vm.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -1828,7 +1828,7 @@ RETRY_TRY_BLOCK: ci = mrb->c->ci; break; case OP_R_BREAK: - if (ci->acc < 0 || !proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) { + if (!proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) { mrb_value exc; L_BREAK_ERROR: @@ -1843,8 +1843,16 @@ RETRY_TRY_BLOCK: mrb->c = c->prev; c->prev = NULL; + ci = mrb->c->ci; + } + if (ci->acc < 0) { + while (eidx > mrb->c->ci[-1].eidx) { + ecall(mrb, --eidx); + } + mrb->c->vmexec = FALSE; + mrb->jmp = prev_jmp; + return v; } - ci = mrb->c->ci; mrb->c->stack = ci->stackent; mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1; while (ci > mrb->c->ci) { |
