зеркало из https://github.com/github/ruby.git
Fix `Ractor.make_shareable` for recursive structures with unfreezable components
Followup to #3823
This commit is contained in:
Родитель
750e2d9e5e
Коммит
e25165b3fc
|
@ -984,6 +984,17 @@ assert_equal '[false, false]', %q{
|
|||
[Ractor.shareable?(x), Ractor.shareable?(y)]
|
||||
}
|
||||
|
||||
# Ractor.make_shareable(recursive_objects)
|
||||
assert_equal '[:ok, false, false]', %q{
|
||||
o = Object.new
|
||||
def o.freeze; raise; end
|
||||
y = []
|
||||
x = [y, o].freeze
|
||||
y << x
|
||||
y.freeze
|
||||
[(Ractor.make_shareable(x) rescue :ok), Ractor.shareable?(x), Ractor.shareable?(y)]
|
||||
}
|
||||
|
||||
# define_method() can invoke different Ractor's proc if the proc is shareable.
|
||||
assert_equal '1', %q{
|
||||
class C
|
||||
|
|
2
ractor.c
2
ractor.c
|
@ -2089,7 +2089,7 @@ rb_ractor_make_shareable(VALUE obj)
|
|||
{
|
||||
rb_obj_traverse(obj,
|
||||
make_shareable_check_shareable,
|
||||
mark_shareable, mark_shareable);
|
||||
null_leave, mark_shareable);
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче