This commit is contained in:
Aaron Patterson 2025-08-14 19:38:48 +03:00 committed by GitHub
commit a976d2d745
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 15 additions and 6 deletions

View file

@ -434,8 +434,8 @@ assert_equal "allocator undefined for Thread", %q{
r = Ractor.new obj do |msg| r = Ractor.new obj do |msg|
msg msg
end end
rescue TypeError => e rescue Ractor::IsolationError => e
e.message #=> no _dump_data is defined for class Thread e.cause.message #=> no _dump_data is defined for class Thread
else else
'ng' 'ng'
end end
@ -1429,7 +1429,7 @@ assert_equal "ok", %q{
end end
begin begin
Ractor.new{} << err Ractor.new{} << err
rescue TypeError rescue Ractor::IsolationError
'ok' 'ok'
end end
} }

View file

@ -1945,7 +1945,12 @@ copy_enter(VALUE obj, struct obj_traverse_replace_data *data)
return traverse_skip; return traverse_skip;
} }
else { else {
data->replacement = rb_obj_clone(obj); int state;
VALUE result = rb_protect(rb_obj_clone, obj, &state);
if (state) {
rb_raise(rb_eRactorIsolationError, "cannot copy %"PRIsVALUE"", obj);
}
data->replacement = result;
return traverse_cont; return traverse_cont;
} }
} }

View file

@ -30,6 +30,10 @@ class TestRactor < Test::Unit::TestCase
assert_make_shareable(x) assert_make_shareable(x)
end end
def test_cannot_copy_proc
assert_unshareable(-> { }, /cannot copy/, copy: true)
end
def test_shareability_of_method_proc def test_shareability_of_method_proc
str = +"" str = +""
@ -207,10 +211,10 @@ class TestRactor < Test::Unit::TestCase
assert Ractor.shareable?(obj), "object didn't become shareable" assert Ractor.shareable?(obj), "object didn't become shareable"
end end
def assert_unshareable(obj, msg=nil, exception: Ractor::IsolationError) def assert_unshareable(obj, msg=nil, copy: false, exception: Ractor::IsolationError)
refute Ractor.shareable?(obj), "object is already shareable" refute Ractor.shareable?(obj), "object is already shareable"
assert_raise_with_message(exception, msg) do assert_raise_with_message(exception, msg) do
Ractor.make_shareable(obj) Ractor.make_shareable(obj, copy:)
end end
refute Ractor.shareable?(obj), "despite raising, object became shareable" refute Ractor.shareable?(obj), "despite raising, object became shareable"
end end