summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--hash.c19
2 files changed, 8 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 2bc9327aef..0a8508d537 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Dec 8 11:59:40 2013 Aman Gupta <ruby@tmm1.net>
+
+ * hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on
+ hashes using Hash#replace [Bug #9226] [ruby-core:58948]
+
Sun Dec 8 11:21:00 2013 Aman Gupta <ruby@tmm1.net>
* include/ruby/ruby.h: add RGENGC_WB_PROTECTED_NODE_CREF setting
diff --git a/hash.c b/hash.c
index 1321b83191..7e18a4049a 100644
--- a/hash.c
+++ b/hash.c
@@ -1412,22 +1412,9 @@ rb_hash_replace(VALUE hash, VALUE hash2)
table2 = RHASH(hash2)->ntbl;
- if (RHASH_EMPTY_P(hash2)) {
- rb_hash_clear(hash);
- if (table2) hash_tbl(hash)->type = table2->type;
- return hash;
- }
-
- if (RHASH_ITER_LEV(hash) > 0) {
- rb_hash_clear(hash);
- hash_tbl(hash)->type = table2->type;
- rb_hash_foreach(hash2, replace_i, hash);
- }
- else {
- st_table *old_table = RHASH(hash)->ntbl;
- if (old_table) st_free_table(old_table);
- RHASH(hash)->ntbl = st_copy(table2);
- }
+ rb_hash_clear(hash);
+ hash_tbl(hash)->type = table2->type;
+ rb_hash_foreach(hash2, replace_i, hash);
return hash;
}