summaryrefslogtreecommitdiff
path: root/test/ruby/test_module.rb
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-08-09 11:00:34 +0900
committerKoichi Sasada <ko1@atdot.net>2019-08-09 11:05:11 +0900
commit71efad1ed391ee0c5398a76306fdbaaadd4dc52e (patch)
treed560b4a717ee7d15d23dc4ea02b1708f7d1d71ea /test/ruby/test_module.rb
parentc7acb37248d4cef76647f8bc7ebd7dc291d9a853 (diff)
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]
Diffstat (limited to 'test/ruby/test_module.rb')
-rw-r--r--test/ruby/test_module.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index cf50db3374..b8d6ffb19d 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -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)