This commit is contained in:
zzak 2025-08-14 16:18:11 +07:00 committed by GitHub
commit ad37da4841
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 24 additions and 0 deletions

View file

@ -1884,6 +1884,10 @@ move_enter(VALUE obj, struct obj_traverse_replace_data *data)
return traverse_skip;
}
else {
if (FL_TEST_RAW(obj, FL_FINALIZE)) {
rb_raise(rb_eRactorError, "can not move an object with finalizer");
}
VALUE type = RB_BUILTIN_TYPE(obj);
type |= wb_protected_types[type] ? FL_WB_PROTECTED : 0;
NEWOBJ_OF(moved, struct RBasic, 0, type, rb_gc_obj_slot_size(obj), 0);
@ -1922,6 +1926,7 @@ move_leave(VALUE obj, struct obj_traverse_replace_data *data)
MEMZERO((char *)obj, char, sizeof(struct RBasic));
RBASIC(obj)->flags = flags;
RBASIC_SET_CLASS_RAW(obj, rb_cRactorMovedObject);
return traverse_cont;
}

View file

@ -52,4 +52,23 @@ class TestObjSpaceRactor < Test::Unit::TestCase
ractors.each(&:join)
RUBY
end
def test_move_finalizer
assert_ractor(<<~'RUBY', require: 'objspace')
r = Ractor.new do
Ractor.receive
end
1_000.times do
o = Object.new
ObjectSpace.define_finalizer(o, proc { })
begin
r.send(o, move: true)
rescue Ractor::Error => e
raise unless e.message.include?("finalizer")
break
end
end
RUBY
end
end