mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Merge 3f70bf14e3
into a04555c8ab
This commit is contained in:
commit
a976d2d745
3 changed files with 15 additions and 6 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
7
ractor.c
7
ractor.c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue