summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-23 15:24:31 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-23 15:24:31 +0900
commit76ddf86c72ccefefbeb2cd5dcf78c8365b1a2bcc (patch)
tree60f2dda2c46002f6592013926a9a487d2fc68252 /src
parent93d710117df22f99c2fd60632a77202a745a2b4a (diff)
downloadmruby-76ddf86c72ccefefbeb2cd5dcf78c8365b1a2bcc.tar.gz
mruby-76ddf86c72ccefefbeb2cd5dcf78c8365b1a2bcc.zip
manage fiber status (create|running|resumed|terminated)
Diffstat (limited to 'src')
-rw-r--r--src/vm.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index c240ef968..f9aec1520 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1301,7 +1301,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
localjump_error(mrb, LOCALJUMP_ERROR_RETURN);
goto L_RAISE;
}
- mrb->c = mrb->c->prev; /* automatic yield at the end */
+ if (mrb->c->prev->ci == mrb->c->prev->cibase) {
+ mrb_value exc = mrb_exc_new3(mrb, E_RUNTIME_ERROR, mrb_str_new(mrb, "double resume", 13));
+ mrb->exc = mrb_obj_ptr(exc);
+ goto L_RAISE;
+ }
+ /* automatic yield at the end */
+ mrb->c->status = MRB_FIBER_TERMINATED;
+ mrb->c = mrb->c->prev;
}
ci = mrb->c->ci;
break;