diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-11-04 23:58:32 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-11-04 23:58:32 +0900 |
| commit | e386760cc7b7958a8948b0a23b35b3a9df30c354 (patch) | |
| tree | ab7a023e426242ac22ec4f57b2ba8324eaa0e5d6 /mrbgems/mruby-fiber/src | |
| parent | fb831b6a5e7282612d802979c5012e038ab0ad0b (diff) | |
| download | mruby-e386760cc7b7958a8948b0a23b35b3a9df30c354.tar.gz mruby-e386760cc7b7958a8948b0a23b35b3a9df30c354.zip | |
add Fiber.current
Diffstat (limited to 'mrbgems/mruby-fiber/src')
| -rw-r--r-- | mrbgems/mruby-fiber/src/fiber.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index c764b4786..757eb235d 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -232,6 +232,26 @@ fiber_yield(mrb_state *mrb, mrb_value self) return fiber_result(mrb, a, len); } +/* + * call-seq: + * Fiber.current() -> fiber + * + * Returns the current fiber. You need to <code>require 'fiber'</code> + * before using this method. If you are not running in the context of + * a fiber this method will return the root fiber. + */ +static mrb_value +fiber_current(mrb_state *mrb, mrb_value self) +{ + if (!mrb->c->fib) { + struct RFiber *f = (struct RFiber*)mrb_obj_alloc(mrb, MRB_TT_FIBER, mrb_class_ptr(self)); + + f->cxt = mrb->c; + mrb->c->fib = f; + } + return mrb_obj_value(mrb->c->fib); +} + void mrb_mruby_fiber_gem_init(mrb_state* mrb) { @@ -245,6 +265,7 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb) mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE()); mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY()); + mrb_define_class_method(mrb, c, "current", fiber_current, MRB_ARGS_NONE()); } void |
