summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-02-28 18:43:35 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-02-28 18:43:35 +0900
commit6bd3d88eddb8932bd02fadfbf2235c3cba2ad624 (patch)
tree8a9a7780d6a1744ac4735e1b1530452997a695b6 /src/vm.c
parent03fde3576055ca00ddd403ffb29ee1622869dbb6 (diff)
downloadmruby-6bd3d88eddb8932bd02fadfbf2235c3cba2ad624.tar.gz
mruby-6bd3d88eddb8932bd02fadfbf2235c3cba2ad624.zip
support break from fiber block; fix #1766
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index 7d40d1290..ffdd2e5dd 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -955,7 +955,7 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
if (!ci->target_class) { /* return from context modifying method (resume/yield) */
if (!MRB_PROC_CFUNC_P(ci[-1].proc)) {
proc = ci[-1].proc;
- irep = ci[-1].proc->body.irep;
+ irep = proc->body.irep;
pool = irep->pool;
syms = irep->syms;
}
@@ -1359,6 +1359,13 @@ mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int
localjump_error(mrb, LOCALJUMP_ERROR_BREAK);
goto L_RAISE;
}
+ /* break from fiber block */
+ if (mrb->c->ci == mrb->c->cibase && mrb->c->ci->pc) {
+ struct mrb_context *c = mrb->c;
+
+ mrb->c = c->prev;
+ c->prev = NULL;
+ }
ci = mrb->c->ci = mrb->c->cibase + proc->env->cioff + 1;
break;
default: