summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js')
-rw-r--r--deps/v8/test/mjsunit/harmony/weakrefs/cleanup.js90
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);
+
+})();