aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc-Andre Lafortune <github@marc-andre.ca>2020-11-30 15:51:30 -0500
committerMarc-André Lafortune <github@marc-andre.ca>2020-11-30 19:33:37 -0500
commite25165b3fc72166a85ed10e49609153d72333388 (patch)
tree4217620186b22442677853cfe0b880f98398a5a0
parent750e2d9e5ef40f3d69cee957c263a925ff3a3ad6 (diff)
downloadruby-e25165b3fc72166a85ed10e49609153d72333388.tar.gz
Fix `Ractor.make_shareable` for recursive structures with unfreezable components
Followup to #3823
-rw-r--r--bootstraptest/test_ractor.rb11
-rw-r--r--ractor.c2
2 files changed, 12 insertions, 1 deletions
diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb
index 6bd00d546f..7ab6a08875 100644
--- a/bootstraptest/test_ractor.rb
+++ b/bootstraptest/test_ractor.rb
@@ -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
diff --git a/ractor.c b/ractor.c
index 9a09312cf2..6b46d4ba95 100644
--- a/ractor.c
+++ b/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;
}