diff options
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/weakrefs/unregister-many.js')
-rw-r--r-- | deps/v8/test/mjsunit/harmony/weakrefs/unregister-many.js | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/deps/v8/test/mjsunit/harmony/weakrefs/unregister-many.js b/deps/v8/test/mjsunit/harmony/weakrefs/unregister-many.js index f9ff219d65..b94ec54e86 100644 --- a/deps/v8/test/mjsunit/harmony/weakrefs/unregister-many.js +++ b/deps/v8/test/mjsunit/harmony/weakrefs/unregister-many.js @@ -4,46 +4,51 @@ // Flags: --expose-gc --noincremental-marking -let cleanup_call_count = 0; -let cleanup_holdings_count = 0; -let cleanup = function(holdings) { - assertEquals("holdings2", holdings); - ++cleanup_holdings_count; - ++cleanup_call_count; -} - -let fg = new FinalizationRegistry(cleanup); -let key1 = {"k": "key1"}; -let key2 = {"k": "key2"}; -// Create three objects and register them in the FinalizationRegistry. The objects -// need to be inside a closure so that we can reliably kill them! - -(function() { - let object1a = {}; - fg.register(object1a, "holdings1a", key1); - - let object1b = {}; - fg.register(object1b, "holdings1b", key1); - - let object2 = {}; - fg.register(object2, "holdings2", key2); - - // Unregister before the GC has a chance to discover the objects. - let success = fg.unregister(key1); - assertTrue(success); - - // objects go out of scope. -})(); +(async function () { + + let cleanup_call_count = 0; + let cleanup = function(holdings) { + assertEquals("holdings2", holdings); + ++cleanup_call_count; + } + + let fg = new FinalizationRegistry(cleanup); + let key1 = {"k": "key1"}; + let key2 = {"k": "key2"}; + // Create three objects and register them in the FinalizationRegistry. The objects + // need to be inside a closure so that we can reliably kill them! + + (function() { + let object1a = {}; + fg.register(object1a, "holdings1a", key1); + + let object1b = {}; + fg.register(object1b, "holdings1b", key1); -// This GC will reclaim the target objects. -gc(); -assertEquals(0, cleanup_call_count); + let object2 = {}; + fg.register(object2, "holdings2", key2); -// Assert that the cleanup function will be called only for the reference which -// was not unregistered. -let timeout_func = function() { - assertEquals(1, cleanup_call_count); - assertEquals(1, cleanup_holdings_count); -} + // Unregister before the GC has a chance to discover the objects. + let success = fg.unregister(key1); + assertTrue(success); -setTimeout(timeout_func, 0); + // objects go out of scope. + })(); + + // This GC will reclaim the target objects. + // 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 will be called only for the reference which + // was not unregistered. + let timeout_func = function() { + assertEquals(1, cleanup_call_count); + } + + setTimeout(timeout_func, 0); + +})(); |