Fix ractor move of unshareable frozen objects

These objects didn't retain their frozen status after the move

Bug [#19408]
This commit is contained in:
Luke Gruber 2024-02-16 14:08:39 -05:00 committed by Koichi Sasada
parent 1eb5c03fda
commit 38af38edcb
Notes: git 2024-12-24 02:39:01 +00:00
2 changed files with 15 additions and 0 deletions

View File

@ -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

View File

@ -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);