1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

ObjectSpace._id2ref should not support unshareable

ObjectSpace._id2ref(id) can return any objects even if they are
unshareable, so this patch raises RangeError if it runs on multi-ractor
mode and the found object is unshareable.
This commit is contained in:
Koichi Sasada 2020-12-10 13:27:08 +09:00
parent 7856da5fe7
commit 72f1c43584
Notes: git 2020-12-10 18:28:09 +09:00
2 changed files with 22 additions and 1 deletions

View file

@ -919,6 +919,19 @@ assert_equal '0', %q{
}.take
}
# ObjectSpace._id2ref can not handle unshareable objects with Ractors
assert_equal 'ok', %q{
s = 'hello'
Ractor.new s.object_id do |id ;s|
begin
s = ObjectSpace._id2ref(id)
rescue => e
:ok
end
end.take
}
# Ractor.make_shareable(obj)
assert_equal 'true', %q{
class C

10
gc.c
View file

@ -3987,6 +3987,8 @@ id2ref_obj_tbl(rb_objspace_t *objspace, VALUE objid)
* r = ObjectSpace._id2ref(s.object_id) #=> "I am a string"
* r == s #=> true
*
* On multi-ractor mode, if the object is not sharable, it raises
* RangeError.
*/
static VALUE
@ -4023,7 +4025,13 @@ id2ref(VALUE objid)
if ((orig = id2ref_obj_tbl(objspace, objid)) != Qundef &&
is_live_object(objspace, orig)) {
return orig;
if (!rb_multi_ractor_p() || rb_ractor_shareable_p(orig)) {
return orig;
}
else {
rb_raise(rb_eRangeError, "%+"PRIsVALUE" is id of the unshareable object on multi-ractor", rb_int2str(objid, 10));
}
}
if (rb_int_ge(objid, objspace->next_object_id)) {