mirror of
https://github.com/ruby/ruby.git
synced 2025-09-23 12:33:56 +02:00
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:
parent
c7acb37248
commit
71efad1ed3
5 changed files with 60 additions and 14 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue