| // 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); |