summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-19 19:38:57 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-19 19:38:57 +0900
commit77c2aa7b8aaf2c3611189e84c48ac3ee74d2f47d (patch)
treed1b1f8e31f6d8120e77f16d5e9989d17c719da8b /src/vm.c
parent283d145d3efd04b04a008193e34f8b0f9d0aff16 (diff)
downloadmruby-77c2aa7b8aaf2c3611189e84c48ac3ee74d2f47d.tar.gz
mruby-77c2aa7b8aaf2c3611189e84c48ac3ee74d2f47d.zip
Need to raise "break from proc-closure" error; fix #3359 fix #3495
Some examples in #3359 still behave differently from CRuby.
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/vm.c b/src/vm.c
index 80a09b259..91aca3eb0 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1803,8 +1803,13 @@ RETRY_TRY_BLOCK:
ci = mrb->c->ci;
break;
case OP_R_BREAK:
- if (!proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) {
- localjump_error(mrb, LOCALJUMP_ERROR_BREAK);
+ if (ci->acc < 0 || !proc->env || !MRB_ENV_STACK_SHARED_P(proc->env)) {
+ mrb_value exc;
+
+ L_BREAK_ERROR:
+ exc = mrb_exc_new_str_lit(mrb, E_LOCALJUMP_ERROR,
+ "break from proc-closure");
+ mrb_exc_set(mrb, exc);
goto L_RAISE;
}
/* break from fiber block */
@@ -1820,7 +1825,7 @@ RETRY_TRY_BLOCK:
while (ci > mrb->c->ci) {
if (ci[-1].acc == CI_ACC_SKIP) {
mrb->c->ci = ci;
- break;
+ goto L_BREAK_ERROR;
}
if (ci->env) {
mrb_env_unshare(mrb, ci->env);