From 7f53da94fb23687ef3bea0507199196a00ca26f8 Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Fri, 8 Sep 2023 14:31:29 +0100 Subject: Fix weak_references count test This test creates a lot of Objects held in an array, and a set of weak references to them using WeakMap. It then clears the array and frees it and asserts that all the weak references to it are also gone. This test is failing because one of the dummy objects in our weakmap is ending up on the stack, and so is being marked, even though we thought that we'd removed the only reference to it. This behaviour has changed since this commit: https://github.com/ruby/ruby/commit/5b5ae3d9e064e17e2a7d8d21d739fcc62ae1075c which rewrites `Integer#times` from C into Ruby. This change is somehow causing the last object we append to our array to consistently end up on the stack during GC. This commit fixes the specific weakmap test by using an enumerator and each, instead of `Integer#times`, and thus avoids having our last object created end up on the stack. --- test/ruby/test_gc.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'test/ruby') diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 0b4062e99f..567e7b5d80 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -303,7 +303,8 @@ class TestGc < Test::Unit::TestCase # Create some objects and place it in a WeakMap wmap = ObjectSpace::WeakMap.new ary = Array.new(count) - count.times do |i| + enum = count.times + enum.each.with_index do |i| obj = Object.new ary[i] = obj wmap[obj] = nil -- cgit v1.2.3