diff options
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js')
-rw-r--r-- | deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js | 90 |
1 files changed, 49 insertions, 41 deletions
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js b/deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js index 730312cba5..f89b646d13 100644 --- a/deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js +++ b/deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js @@ -4,48 +4,56 @@ // Flags: --expose-gc --noincremental-marking -let cleanup_called = 0; -let holdings_list = []; -let cleanup = function(holdings) { - holdings_list.push(holdings); - cleanup_called++; -} - -let fg = new FinalizationRegistry(cleanup); -let o1 = {}; -let o2 = {}; - -// Ignition holds references to objects in temporary registers. These will be -// released when the function exits. So only access o inside a function to -// prevent any references to objects in temporary registers when a gc is -(function() { - fg.register(o1, 1); - fg.register(o2, 2); -})(); - -gc(); -assertEquals(cleanup_called, 0); +(async function () { -// Drop the last references to o1 and o2. -(function() { - o1 = null; - o2 = null; -})(); + let cleanup_called = 0; + let holdings_list = []; + let cleanup = function (holdings) { + holdings_list.push(holdings); + cleanup_called++; + } -// GC will reclaim the target objects; the cleanup function will be called the -// next time we enter the event loop. -gc(); -assertEquals(cleanup_called, 0); - -let timeout_func = function() { - assertEquals(cleanup_called, 2); - assertEquals(holdings_list.length, 2); - if (holdings_list[0] == 1) { - assertEquals(holdings_list[1], 2); - } else { - assertEquals(holdings_list[0], 2); - assertEquals(holdings_list[1], 1); + let fg = new FinalizationRegistry(cleanup); + let o1 = {}; + let o2 = {}; + + // Ignition holds references to objects in temporary registers. These will be + // released when the function exits. So only access o inside a function to + // prevent any references to objects in temporary registers when a gc is + (function () { + fg.register(o1, 1); + fg.register(o2, 2); + })(); + + // Here and below, we need to invoke GC asynchronously and wait for it to + // finish, so that it doesn't need to scan the stack. Otherwise, the objects + // may not be reclaimed because of conservative stack scanning and the test + // may not work as intended. + await gc({ type: 'major', execution: 'async' }); + assertEquals(cleanup_called, 0); + + // Drop the last references to o1 and o2. + (function () { + o1 = null; + o2 = null; + })(); + + // GC will reclaim the target objects; the cleanup function will be called the + // next time we enter the event loop. + await gc({ type: 'major', execution: 'async' }); + assertEquals(cleanup_called, 0); + + let timeout_func = function () { + assertEquals(cleanup_called, 2); + assertEquals(holdings_list.length, 2); + if (holdings_list[0] == 1) { + assertEquals(holdings_list[1], 2); + } else { + assertEquals(holdings_list[0], 2); + assertEquals(holdings_list[1], 1); + } } -} -setTimeout(timeout_func, 0); + setTimeout(timeout_func, 0); + +})(); |