diff options
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js')
-rw-r--r-- | deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js | 81 |
1 files changed, 43 insertions, 38 deletions
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js b/deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js index 7479996844..6786183af9 100644 --- a/deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js +++ b/deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js @@ -4,45 +4,50 @@ // Flags: --expose-gc --noincremental-marking -let cleanup_call_count = 0; -let cleanup_holdings_count = 0; -let cleanup = function(holdings) { - // See which target we're cleaning up and unregister the other one. - if (holdings == 1) { - let success = fg.unregister(key2); - assertTrue(success); - } else { - assertSame(holdings, 2); - let success = fg.unregister(key1); - assertTrue(success); +(async function () { + + let cleanup_call_count = 0; + let cleanup = function(holdings) { + // See which target we're cleaning up and unregister the other one. + if (holdings == 1) { + let success = fg.unregister(key2); + assertTrue(success); + } else { + assertSame(holdings, 2); + let success = fg.unregister(key1); + assertTrue(success); + } + ++cleanup_call_count; } - ++cleanup_holdings_count; - ++cleanup_call_count; -} - -let fg = new FinalizationRegistry(cleanup); -let key1 = {"k": "first key"}; -let key2 = {"k": "second key"}; -// Create two objects and register them in the FinalizationRegistry. The objects -// need to be inside a closure so that we can reliably kill them! - -(function() { - let object1 = {}; - fg.register(object1, 1, key1); - let object2 = {}; - fg.register(object2, 2, key2); - - // object1 and object2 go out of scope. -})(); -// This GC will reclaim target objects and schedule cleanup. -gc(); -assertEquals(0, cleanup_call_count); + let fg = new FinalizationRegistry(cleanup); + let key1 = {"k": "first key"}; + let key2 = {"k": "second key"}; + // Create two objects and register them in the FinalizationRegistry. The objects + // need to be inside a closure so that we can reliably kill them! + + (function() { + let object1 = {}; + fg.register(object1, 1, key1); + let object2 = {}; + fg.register(object2, 2, key2); + + // object1 and object2 go out of scope. + })(); + + // This GC will reclaim target objects and schedule cleanup. + // 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(0, cleanup_call_count); + + // Assert that the cleanup function was called and cleaned up one holdings (but not the other one). + let timeout_func = function() { + assertEquals(1, cleanup_call_count); + } -// Assert that the cleanup function was called and cleaned up one holdings (but not the other one). -let timeout_func = function() { - assertEquals(1, cleanup_call_count); - assertEquals(1, cleanup_holdings_count); -} + setTimeout(timeout_func, 0); -setTimeout(timeout_func, 0); +})(); |