summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-20 13:14:01 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-20 13:14:01 +0900
commitedd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3 (patch)
treefafe86dea1118a78736035954251c94f9c27ed4e
parent6a0b68f8b81adff8bc9fa58764eb014fa30de1c5 (diff)
downloadmruby-edd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3.tar.gz
mruby-edd9fc6e75e26e154ab6af5c504f3bd38ecbfdd3.zip
Do not raise an exception for living closure; ref #3359
-rw-r--r--src/vm.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index 041a5238c..dbdba6742 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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) {