summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/harmony/weakrefs/unregister-inside-cleanup2.js
diff options
context:
space:
mode:
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.js81
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);
+})();