summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-fiber/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-20 22:33:25 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-20 22:33:25 +0900
commit58b25fdcb3bf92050296a624abc4934b83fab01c (patch)
treec639a65d5a92326ea519803cc2e73efb1a39a2bd /mrbgems/mruby-fiber/src
parent7320139fd91ce86a6e58d56a25e04136b87bbd9a (diff)
downloadmruby-58b25fdcb3bf92050296a624abc4934b83fab01c.tar.gz
mruby-58b25fdcb3bf92050296a624abc4934b83fab01c.zip
avoid unnecessary pool/syms restoration
Diffstat (limited to 'mrbgems/mruby-fiber/src')
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 51495e9bd..5dec8a3c0 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -126,6 +126,9 @@ fiber_result(mrb_state *mrb, mrb_value *a, int len)
return mrb_ary_new_from_values(mrb, len, a);
}
+/* mark return from context modifying method */
+#define MARK_CONTEXT_MODIFY(c) (c)->ci->target_class = NULL
+
/*
* call-seq:
* fiber.resume(args, ...) -> obj
@@ -160,11 +163,13 @@ fiber_resume(mrb_state *mrb, mrb_value self)
c->prev = mrb->c;
mrb->c = c;
+ MARK_CONTEXT_MODIFY(c);
return c->ci->proc->env->stack[0];
}
if (c->ci == c->cibase) {
mrb_raise(mrb, E_RUNTIME_ERROR, "resuming dead fiber");
}
+ MARK_CONTEXT_MODIFY(c);
c->prev = mrb->c;
mrb->c = c;
return fiber_result(mrb, a, len);
@@ -193,6 +198,7 @@ fiber_yield(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "*", &a, &len);
mrb->c = c->prev;
+ MARK_CONTEXT_MODIFY(mrb->c);
return fiber_result(mrb, a, len);
}