diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-19 19:38:57 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-19 19:38:57 +0900 |
| commit | 77c2aa7b8aaf2c3611189e84c48ac3ee74d2f47d (patch) | |
| tree | d1b1f8e31f6d8120e77f16d5e9989d17c719da8b /src/vm.c | |
| parent | 283d145d3efd04b04a008193e34f8b0f9d0aff16 (diff) | |
| download | mruby-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.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -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); |
