diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index 08f269dda9..b3ab7f607c 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -752,6 +752,17 @@ assert_equal '[0, 1]', %q{ end } +# unshareable frozen objects should still be frozen in new ractor after move +assert_equal 'true', %q{ +r = Ractor.new do + obj = receive + { frozen: obj.frozen? } +end +obj = [Object.new].freeze +r.send(obj, move: true) +r.take[:frozen] +} + # move with yield assert_equal 'hello', %q{ r = Ractor.new do diff --git a/ractor.c b/ractor.c index 0240d1f216..2dfd56d068 100644 --- a/ractor.c +++ b/ractor.c @@ -3581,6 +3581,10 @@ move_leave(VALUE obj, struct obj_traverse_replace_data *data) rb_replace_generic_ivar(v, obj); } + if (OBJ_FROZEN(obj)) { + OBJ_FREEZE(v); + } + // TODO: generic_ivar ractor_moved_bang(obj);