mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
allow to access ivars of frozen shareable objects
Accessing a shareable object is prohibitted because it can cause race condition, but if the shareable object is frozen, there is no problem to access ivars.
This commit is contained in:
parent
9629378477
commit
0c0d0752f1
2 changed files with 14 additions and 1 deletions
|
@ -734,6 +734,18 @@ assert_equal 'can not access instance variables of shareable objects from non-ma
|
|||
end
|
||||
}
|
||||
|
||||
# But a sharable object is frozen, it is allowed to access ivars from non-main Ractor
|
||||
assert_equal '11', %q{
|
||||
[Object.new, [], ].map{|obj|
|
||||
obj.instance_variable_set('@a', 1)
|
||||
Ractor.make_shareable obj = obj.freeze
|
||||
|
||||
Ractor.new obj do |obj|
|
||||
obj.instance_variable_get('@a')
|
||||
end.take.to_s
|
||||
}.join
|
||||
}
|
||||
|
||||
# cvar in sharable-objects are not allowed to access from non-main Ractor
|
||||
assert_equal 'can not access class variables from non-main Ractors', %q{
|
||||
class C
|
||||
|
|
|
@ -922,7 +922,8 @@ generic_ivtbl(VALUE obj, ID id, bool force_check_ractor)
|
|||
{
|
||||
ASSERT_vm_locking();
|
||||
|
||||
if ((force_check_ractor || rb_is_instance_id(id)) && // not internal ID
|
||||
if ((force_check_ractor || LIKELY(rb_is_instance_id(id)) /* not internal ID */ ) &&
|
||||
!RB_OBJ_FROZEN_RAW(obj) &&
|
||||
UNLIKELY(!rb_ractor_main_p()) &&
|
||||
UNLIKELY(rb_ractor_shareable_p(obj))) {
|
||||
rb_raise(rb_eRuntimeError, "can not access instance variables of shareable objects from non-main Ractors");
|
||||
|
|
Loading…
Reference in a new issue