diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-02-28 18:43:35 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-02-28 18:43:35 +0900 |
| commit | 6bd3d88eddb8932bd02fadfbf2235c3cba2ad624 (patch) | |
| tree | 8a9a7780d6a1744ac4735e1b1530452997a695b6 /src | |
| parent | 03fde3576055ca00ddd403ffb29ee1622869dbb6 (diff) | |
| download | mruby-6bd3d88eddb8932bd02fadfbf2235c3cba2ad624.tar.gz mruby-6bd3d88eddb8932bd02fadfbf2235c3cba2ad624.zip | |
support break from fiber block; fix #1766
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -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: |
