Skip to content

Commit

Permalink
Free previously used tables [Bug #18134]
Browse files Browse the repository at this point in the history
  • Loading branch information
nobu committed Aug 29, 2021
1 parent 265a725 commit a615885
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 15 deletions.
22 changes: 7 additions & 15 deletions hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -2951,25 +2951,17 @@ rb_hash_replace(VALUE hash, VALUE hash2)
COPY_DEFAULT(hash, hash2);

if (RHASH_AR_TABLE_P(hash)) {
if (RHASH_AR_TABLE_P(hash2)) {
ar_clear(hash);
}
else {
ar_free_and_clear_table(hash);
RHASH_ST_TABLE_SET(hash, st_init_table_with_size(RHASH_TYPE(hash2), RHASH_SIZE(hash2)));
}
ar_free_and_clear_table(hash);
}
else {
if (RHASH_AR_TABLE_P(hash2)) {
st_free_table(RHASH_ST_TABLE(hash));
RHASH_ST_CLEAR(hash);
}
else {
st_clear(RHASH_ST_TABLE(hash));
RHASH_TBL_RAW(hash)->type = RHASH_ST_TABLE(hash2)->type;
}
st_free_table(RHASH_ST_TABLE(hash));
RHASH_ST_CLEAR(hash);
}
hash_copy(hash, hash2);
if (RHASH_EMPTY_P(hash2) && RHASH_ST_TABLE_P(hash2)) {
/* ident hash */
RHASH_ST_TABLE_SET(hash, st_init_table_with_size(RHASH_TYPE(hash2), 0));
}

rb_gc_writebarrier_remember(hash);

Expand Down
9 changes: 9 additions & 0 deletions test/ruby/test_hash.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1278,6 +1278,15 @@ def test_replace2
assert_raise(FrozenError) { h2.replace(42) }
end

def test_replace_memory_leak
assert_no_memory_leak([], "#{<<-"begin;"}", "#{<<-'end;'}")
h = ("aa".."zz").each_with_index.to_h
10_000.times {h.dup}
begin;
500_000.times {h.dup.replace(h)}
end;
end

def test_size2
assert_equal(0, @cls[].size)
end
Expand Down

0 comments on commit a615885

Please sign in to comment.