Merge pull request #1267 from skandhas/pr-add-Fiber-alive_p

add Fiber#alive?
This commit is contained in:
Yukihiro "Matz" Matsumoto
2013-05-27 06:09:13 -07:00
2 changed files with 26 additions and 2 deletions
+17 -2
View File
@@ -188,6 +188,20 @@ fiber_resume(mrb_state *mrb, mrb_value self)
return fiber_result(mrb, a, len);
}
/*
* call-seq:
* fiber.alive? -> true or false
*
* Returns true if the fiber can still be resumed. After finishing
* execution of the fiber block this method will always return false.
*/
static mrb_value
fiber_alive_p(mrb_state *mrb, mrb_value self)
{
struct mrb_context *c = fiber_check(mrb, self);
return mrb_bool_value(c->status != MRB_FIBER_TERMINATED);
}
/*
* call-seq:
* Fiber.yield(args, ...) -> obj
@@ -224,8 +238,9 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb)
c = mrb_define_class(mrb, "Fiber", mrb->object_class);
MRB_SET_INSTANCE_TT(c, MRB_TT_FIBER);
mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE());
mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY());
mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE());
mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY());
mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE());
mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY());
}
+9
View File
@@ -8,6 +8,15 @@ assert('Fiber#resume') {
f.resume(2)
}
assert('Fiber#alive?') {
f = Fiber.new{ Fiber.yield }
f.resume
r1 = f.alive?
f.resume
r2 = f.alive?
r1 == true and r2 == false
}
assert('Fiber.yield') {
f = Fiber.new{|x| Fiber.yield(x == 3)}
f.resume(3)