diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | hash.c | 2 | ||||
-rw-r--r-- | test/ruby/test_hash.rb | 10 |
3 files changed, 17 insertions, 1 deletions
@@ -1,3 +1,9 @@ +Mon Dec 9 18:50:43 2013 Aman Gupta <ruby@tmm1.net> + + * hash.c (rb_hash_replace): fix segv on `{}.replace({})` introduced + in r44060 [Bug #9230] [ruby-core:58991] + * test/ruby/test_hash.rb: regression test for above + Mon Dec 9 18:10:10 2013 Koichi Sasada <ko1@atdot.net> * vm.c (vm_stat): renamed from ruby_vm_stat. @@ -1414,7 +1414,7 @@ rb_hash_replace(VALUE hash, VALUE hash2) table2 = RHASH(hash2)->ntbl; rb_hash_clear(hash); - hash_tbl(hash)->type = table2->type; + if (table2) hash_tbl(hash)->type = table2->type; rb_hash_foreach(hash2, replace_i, hash); return hash; diff --git a/test/ruby/test_hash.rb b/test/ruby/test_hash.rb index 0593785148..afb0ca4805 100644 --- a/test/ruby/test_hash.rb +++ b/test/ruby/test_hash.rb @@ -592,6 +592,16 @@ class TestHash < Test::Unit::TestCase assert_nil(h[2]) end + def test_replace_bug9230 + h = @cls[] + h.replace(@cls[]) + assert_empty h + + h = @cls[] + h.replace(@cls[].compare_by_identity) + assert_predicate(h, :compare_by_identity?) + end + def test_shift h = @h.dup |