introduce RCLASS_CLONED flag for inline cache.

Methods on duplicated class/module refer same constant inline
cache (IC). Constant access lookup should be done for cloned
class/modules but inline cache doesn't check it.
To check it, this patch introduce new RCLASS_CLONED flag which
are set when if class/module is cloned (both orig and dst).
[Bug #15877]
This commit is contained in:
Koichi Sasada 2019-08-09 11:00:34 +09:00
parent c7acb37248
commit 71efad1ed3
5 changed files with 60 additions and 14 deletions

View file

@ -2418,6 +2418,39 @@ class TestModule < Test::Unit::TestCase
}
end
module CloneTestM_simple
C = 1
def self.m; C; end
end
module CloneTestM0
def foo; TEST; end
end
CloneTestM1 = CloneTestM0.clone
CloneTestM2 = CloneTestM0.clone
module CloneTestM1
TEST = :M1
end
module CloneTestM2
TEST = :M2
end
class CloneTestC1
include CloneTestM1
end
class CloneTestC2
include CloneTestM2
end
def test_constant_access_from_method_in_cloned_module
m = CloneTestM_simple.dup
assert_equal 1, m::C, '[ruby-core:47834]'
assert_equal 1, m.m, '[ruby-core:47834]'
assert_equal :M1, CloneTestC1.new.foo, '[Bug #15877]'
assert_equal :M2, CloneTestC2.new.foo, '[Bug #15877]'
end
private
def assert_top_method_is_private(method)