summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-02-04 14:01:22 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-02-04 14:01:22 +0900
commit857e384187d8abac2e256f8e97eef3106d982718 (patch)
tree7decf3ef46a2b1408c06e1e6ecc768787ea7726a
parent33bb4578a2ae15e58cb1270adbe9af36d6436311 (diff)
downloadmruby-857e384187d8abac2e256f8e97eef3106d982718.tar.gz
mruby-857e384187d8abac2e256f8e97eef3106d982718.zip
fibers cannot cross C function boundary; close #1680
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 757eb235d..43cf76062 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -218,9 +218,15 @@ static mrb_value
fiber_yield(mrb_state *mrb, mrb_value self)
{
struct mrb_context *c = mrb->c;
+ mrb_callinfo *ci;
mrb_value *a;
- int len;
+ int i, len;
+ for (ci = c->ci; ci >= c->cibase; ci--) {
+ if (ci->acc < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "can't cross C function boundary");
+ }
+ }
if (!c->prev) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "can't yield from root fiber");
}