diff options
-rw-r--r-- | cont.c | 5 | ||||
-rw-r--r-- | test/ruby/test_fiber.rb | 1 |
2 files changed, 6 insertions, 0 deletions
@@ -1896,9 +1896,14 @@ rb_fiber_resume(VALUE fibval, int argc, const VALUE *argv) { rb_fiber_t *fib = fiber_ptr(fibval); + if (argc == -1 && FIBER_CREATED_P(fib)) { + rb_raise(rb_eFiberError, "cannot raise exception on unborn fiber"); + } + if (fib->prev != 0 || fiber_is_root_p(fib)) { rb_raise(rb_eFiberError, "double resume"); } + if (fib->transferred != 0) { rb_raise(rb_eFiberError, "cannot resume transferred Fiber"); } diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb index db2627d9a1..ec6bd0201c 100644 --- a/test/ruby/test_fiber.rb +++ b/test/ruby/test_fiber.rb @@ -144,6 +144,7 @@ class TestFiber < Test::Unit::TestCase } assert_raise(RuntimeError){ fib = Fiber.new{ Fiber.yield } + fib.resume fib.raise "raise and propagate" } assert_nothing_raised{ |