Skip to content

Commit

Permalink
Add C interface spec.
Browse files Browse the repository at this point in the history
  • Loading branch information
ioquatix committed Sep 20, 2021
1 parent 88ba5fe commit 649c87b
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
11 changes: 11 additions & 0 deletions spec/ruby/optional/capi/ext/fiber_spec.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,24 @@ VALUE fiber_spec_rb_fiber_new(VALUE self) {
return rb_fiber_new(fiber_spec_rb_fiber_new_function, Qnil);
}

#ifdef RUBY_VERSION_IS_3_1
VALUE fiber_spec_rb_fiber_raise(int argc, VALUE *argv, VALUE self) {
VALUE fiber = argv[0];
return rb_fiber_raise(fiber, argc-1, argv+1);
}
#endif

void Init_fiber_spec(void) {
VALUE cls = rb_define_class("CApiFiberSpecs", rb_cObject);
rb_define_method(cls, "rb_fiber_current", fiber_spec_rb_fiber_current, 0);
rb_define_method(cls, "rb_fiber_alive_p", fiber_spec_rb_fiber_alive_p, 1);
rb_define_method(cls, "rb_fiber_resume", fiber_spec_rb_fiber_resume, 2);
rb_define_method(cls, "rb_fiber_yield", fiber_spec_rb_fiber_yield, 1);
rb_define_method(cls, "rb_fiber_new", fiber_spec_rb_fiber_new, 0);

#ifdef RUBY_VERSION_IS_3_1
rb_define_method(cls, "rb_fiber_raise", fiber_spec_rb_fiber_raise, -1);
#endif
}

#ifdef __cplusplus
Expand Down
38 changes: 38 additions & 0 deletions spec/ruby/optional/capi/fiber_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,42 @@
fiber.resume(42).should == "42"
end
end

describe "rb_fiber_raise" do
ruby_version_is '3.1' do
it "raises an exception on the resumed fiber" do
fiber = Fiber.new do
begin
Fiber.yield
rescue => error
error
end
end

fiber.resume

result = @s.rb_fiber_raise(fiber, "Boom!")
result.should be_an_instance_of(RuntimeError)
result.message.should == "Boom!"
end

it "raises an exception on the transferred fiber" do
main = Fiber.current

fiber = Fiber.new do
begin
main.transfer
rescue => error
error
end
end

fiber.transfer

result = @s.rb_fiber_raise(fiber, "Boom!")
result.should be_an_instance_of(RuntimeError)
result.message.should == "Boom!"
end
end
end
end

0 comments on commit 649c87b

Please sign in to comment.