diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-03-07 03:32:15 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-03-07 03:34:17 +0900 |
commit | 4c019f5a626523e99e2827ed917802e3097c380d (patch) | |
tree | d3876652cd807713b18163b76940453823b8ca3f /test | |
parent | 44462d32068235ccfcb892c9dde7451e5a0ad7c5 (diff) | |
download | ruby-4c019f5a626523e99e2827ed917802e3097c380d.tar.gz |
check ar_table after `#hash` call
ar_table can be converted to st_table just after `ar_do_hash()`
function which calls `#hash` method. We need to check
the representation to detect this mutation.
[Bug #16676]
Diffstat (limited to 'test')
-rw-r--r-- | test/ruby/test_hash.rb | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/test/ruby/test_hash.rb b/test/ruby/test_hash.rb index 3c799b7a04..33d1383ed7 100644 --- a/test/ruby/test_hash.rb +++ b/test/ruby/test_hash.rb @@ -1783,4 +1783,62 @@ class TestHash < Test::Unit::TestCase assert_equal(1, check_flagged_hash(*[hash])) assert_raise(TypeError) { Hash.ruby2_keywords_hash(1) } end + + def test_ar2st + # insert + obj = Object.new + obj.instance_variable_set(:@h, h = {}) + def obj.hash + 10.times{|i| @h[i] = i} + 0 + end + def obj.inspect + 'test' + end + h[obj] = true + assert_equal '{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}', h.inspect + + # delete + obj = Object.new + obj.instance_variable_set(:@h, h = {}) + def obj.hash + 10.times{|i| @h[i] = i} + 0 + end + def obj.inspect + 'test' + end + def obj.eql? other + other.class == Object + end + obj2 = Object.new + def obj2.hash + 0 + end + + h[obj2] = true + h.delete obj + assert_equal '{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}', h.inspect + + # lookup + obj = Object.new + obj.instance_variable_set(:@h, h = {}) + def obj.hash + 10.times{|i| @h[i] = i} + 0 + end + def obj.inspect + 'test' + end + def obj.eql? other + other.class == Object + end + obj2 = Object.new + def obj2.hash + 0 + end + + h[obj2] = true + assert_equal true, h[obj] + end end |