mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #1267 from skandhas/pr-add-Fiber-alive_p
add Fiber#alive?
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user