From 46b62f44ce30bf234a76114c8249081e47ce3da4 Mon Sep 17 00:00:00 2001 From: nagachika Date: Sat, 22 Jul 2023 11:44:54 +0900 Subject: merge revision(s) 3592b24cdc07ed89eecb39161f21fe721a89a5de: [Backport #19531] ObjectSpace::WeakMap: clean inverse reference when an entry is re-assigned [Bug #19531] ```ruby wmap[1] = "A" wmap[1] = "B" ``` In the example above, we need to remove the `"A" => 1` inverse reference so that when `"A"` is GCed the `1` key isn't deleted. --- test/ruby/test_weakmap.rb | 17 +++++++++ weakmap.c | 91 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 91 insertions(+), 17 deletions(-) --- test/ruby/test_weakmap.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'test/ruby') diff --git a/test/ruby/test_weakmap.rb b/test/ruby/test_weakmap.rb index 6455034743..7fc956dfae 100644 --- a/test/ruby/test_weakmap.rb +++ b/test/ruby/test_weakmap.rb @@ -196,4 +196,21 @@ class TestWeakMap < Test::Unit::TestCase GC.compact end; end + + def test_replaced_values_bug_19531 + a = "A".dup + b = "B".dup + + @wm[1] = a + @wm[1] = a + @wm[1] = a + + @wm[1] = b + assert_equal b, @wm[1] + + a = nil + GC.start + + assert_equal b, @wm[1] + end end -- cgit v1.2.3