// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --harmony-weak-refs --expose-gc --noincremental-marking // Flags: --no-stress-flush-bytecode let cleanup0_call_count = 0; let cleanup0_holdings_count = 0; let cleanup1_call_count = 0; let cleanup1_holdings_count = 0; let cleanup0 = function(iter) { for (holdings of iter) { ++cleanup0_holdings_count; } ++cleanup0_call_count; } let cleanup1 = function(iter) { for (holdings of iter) { ++cleanup1_holdings_count; } ++cleanup1_call_count; } let fg0 = new FinalizationGroup(cleanup0); let fg1 = new FinalizationGroup(cleanup1); // Register 1 weak reference for each FinalizationGroup and kill the objects they point to. (function() { // The objects need to be inside a closure so that we can reliably kill them. let objects = []; objects[0] = {}; objects[1] = {}; fg0.register(objects[0], "holdings0-0"); fg1.register(objects[1], "holdings1-0"); // Drop the references to the objects. objects = []; // Will schedule both fg0 and fg1 for cleanup. gc(); })(); // Before the cleanup task has a chance to run, do the same thing again, so both // FinalizationGroups are (again) scheduled for cleanup. This has to be a IIFE function // (so that we can reliably kill the objects) so we cannot use the same function // as before. (function() { let objects = []; objects[0] = {}; objects[1] = {}; fg0.register(objects[0], "holdings0-1"); fg1.register(objects[1], "holdings1-1"); objects = []; gc(); })(); let timeout_func = function() { assertEquals(1, cleanup0_call_count); assertEquals(2, cleanup0_holdings_count); assertEquals(1, cleanup1_call_count); assertEquals(2, cleanup1_holdings_count); } // Give the cleanup task a chance to run. All holdings will be iterated during // the same invocation of the cleanup function. setTimeout(timeout_func, 0);