Project

General

Profile

Feature #10344 » 0001-Implement-Fiber-raise-in-ext-fiber.patch

variant adding Fiber#raise only in ext/fiber - nome (Knut Franke), 10/18/2014 01:16 PM

View differences:

cont.c
make_passing_arg(int argc, const VALUE *argv)
{
switch (argc) {
case -1:
return argv[0];
case 0:
return Qnil;
case 1:
......
/*
* call-seq:
* fiber.raise -> obj
* fiber.raise(string) -> obj
* fiber.raise(exception [, string [, array]]) -> obj
*
* Raises an exception in the fiber at the point at which the last
* <code>Fiber.yield</code> was called, or at the start if neither +resume+
* nor +raise+ were called before. You need to <code>require 'fiber'</code>
* before using this method.
*
* With no arguments, raises a +RuntimeError+. With a single +String+
* argument, raises a +RuntimeError+ with the string as a message. Otherwise,
* the first parameter should be the name of an +Exception+ class (or an
* object that returns an +Exception+ object when sent an +exception+
* message). The optional second parameter sets the message associated with
* the exception, and the third parameter is an array of callback information.
* Exceptions are caught by the +rescue+ clause of <code>begin...end</code>
* blocks.
*/
static VALUE
rb_fiber_raise(int argc, VALUE *argv, VALUE fib)
{
VALUE exc = rb_make_exception(argc, argv);
return rb_fiber_resume(fib, -1, &exc);
}
/*
* call-seq:
* fiber.transfer(args, ...) -> obj
*
* Transfer control to another fiber, resuming it from where it last
......
{
rb_define_method(rb_cFiber, "transfer", rb_fiber_m_transfer, -1);
rb_define_method(rb_cFiber, "alive?", rb_fiber_alive_p, 0);
rb_define_method(rb_cFiber, "raise", rb_fiber_raise, -1);
rb_define_singleton_method(rb_cFiber, "current", rb_fiber_s_current, 0);
}
test/ruby/test_fiber.rb
}
fib.resume
}
assert_raise(FiberError){
fib = Fiber.new{}
fib.raise "raise in unborn fiber"
}
assert_raise(FiberError){
fib = Fiber.new{}
fib.resume
fib.raise "raise in dead fiber"
}
end
def test_return
......
}
end
def test_raise
assert_raise(ZeroDivisionError){
Fiber.new do
1/0
end.resume
}
assert_raise(RuntimeError){
fib = Fiber.new{ Fiber.yield }
fib.raise "raise and propagate"
}
assert_nothing_raised{
fib = Fiber.new do
begin
Fiber.yield
rescue
end
end
fib.resume
fib.raise "rescue in fiber"
}
fib = Fiber.new do
begin
Fiber.yield
rescue
Fiber.yield :ok
end
end
fib.resume
assert_equal(:ok, fib.raise)
end
def test_transfer
ary = []
f2 = nil
(3-3/3)