diff options
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/weakrefs/factory-scheduled-for-cleanup-multiple-times.js')
-rw-r--r-- | deps/v8/test/mjsunit/harmony/weakrefs/factory-scheduled-for-cleanup-multiple-times.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/factory-scheduled-for-cleanup-multiple-times.js b/deps/v8/test/mjsunit/harmony/weakrefs/factory-scheduled-for-cleanup-multiple-times.js new file mode 100644 index 0000000000..2f3915478e --- /dev/null +++ b/deps/v8/test/mjsunit/harmony/weakrefs/factory-scheduled-for-cleanup-multiple-times.js @@ -0,0 +1,71 @@ +// 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_weak_cell_count = 0; + +let cleanup1_call_count = 0; +let cleanup1_weak_cell_count = 0; + +let cleanup0 = function(iter) { + for (wc of iter) { + ++cleanup0_weak_cell_count; + } + ++cleanup0_call_count; +} + +let cleanup1 = function(iter) { + for (wc of iter) { + ++cleanup1_weak_cell_count; + } + ++cleanup1_call_count; +} + +let wf0 = new WeakFactory(cleanup0); +let wf1 = new WeakFactory(cleanup1); + +// Create 1 WeakCell for each WeakFactory 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] = {}; + + wf0.makeCell(objects[0]); + wf1.makeCell(objects[1]); + + // Drop the references to the objects. + objects = []; + + // Will schedule both wf0 and wf1 for cleanup. + gc(); +})(); + +// Before the cleanup task has a chance to run, do the same thing again, so both +// factories 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] = {}; + wf0.makeCell(objects[0]); + wf1.makeCell(objects[1]); + objects = []; + gc(); +})(); + +let timeout_func = function() { + assertEquals(1, cleanup0_call_count); + assertEquals(2, cleanup0_weak_cell_count); + assertEquals(1, cleanup1_call_count); + assertEquals(2, cleanup1_weak_cell_count); +} + +// Give the cleanup task a chance to run. All WeakCells to cleanup will be +// available during the same invocation of the cleanup function. +setTimeout(timeout_func, 0); |