// Copyright 2018 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --harmony-weak-refs --expose-gc --noincremental-marking // This test asserts that the cleanup function call, scheduled by GC, is a // microtask and not a normal task. // Inside a microtask, cause GC (which should schedule the cleanup as // microtask). lso schedule another microtask. Assert that the cleanup // function ran before the other microtask. function scheduleMicrotask(func) { Promise.resolve().then(func); } let log = []; let cleanup = (iter) => { log.push("cleanup"); for (wc of iter) { } } let wf = new WeakFactory(cleanup); let o = null; (function() { // Use a closure here to avoid other references to o which might keep it alive // (e.g., stack frames pointing to it). o = {}; wf.makeCell(o); })(); let microtask_after_cleanup = () => { log.push("microtask_after_cleanup"); } let first_microtask = function() { log.push("first_microtask"); // This schedules the cleanup function as microtask. o = null; gc(); // Schedule a microtask which should run after the cleanup microtask. scheduleMicrotask(microtask_after_cleanup); } scheduleMicrotask(first_microtask); setTimeout(() => { // Assert that the functions got called in the right order. let wanted_log = ["first_microtask", "cleanup", "microtask_after_cleanup"]; assertEquals(wanted_log, log); }, 0);