aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--hash.c2
-rw-r--r--test/ruby/test_hash.rb10
3 files changed, 17 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 7801aae5af..87dc95d8cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/hash.c b/hash.c
index 53d70f9fe7..a6944770a6 100644
--- a/hash.c
+++ b/hash.c
@@ -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