From 3dd248f13d47d708b2e3dcf92ab46937c033f67b Mon Sep 17 00:00:00 2001 From: tmm1 Date: Sun, 8 Dec 2013 03:03:42 +0000 Subject: [PATCH] hash.c: fix WB miss issue in Hash#replace * hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on hashes using Hash#replace [Bug #9226] [ruby-core:58948] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44060 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ hash.c | 19 +++---------------- 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 + + * 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 * 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; }