45 lines
1.1 KiB
JavaScript
45 lines
1.1 KiB
JavaScript
asyncTestStart(1);
|
|
function makeWeakRef() { return new WeakRef({foo: 1 }); }
|
|
noInline(makeWeakRef);
|
|
|
|
// Turns out the test times out if we turn the event loop 10000 times...
|
|
let loopCount = globalThis.window ? 300 : 10000;
|
|
function turnEventLoop() {
|
|
return new Promise(function(resolve, reject) {
|
|
if (globalThis.window) {
|
|
window.setTimeout(() => {
|
|
resolve();
|
|
}, 0);
|
|
} else {
|
|
releaseWeakRefs();
|
|
resolve();
|
|
}
|
|
});
|
|
}
|
|
|
|
let weakRefs = [];
|
|
|
|
async function* foo() {
|
|
let weak = makeWeakRef();
|
|
await 2;
|
|
if (weak.deref().foo !== 1)
|
|
throw new Error("Weak ref was collected too early");
|
|
await turnEventLoop();
|
|
weakRefs.push(weak);
|
|
}
|
|
|
|
async function test() {
|
|
for (let i = 0; i < loopCount; i++) {
|
|
for await (value of foo()) { }
|
|
if (i % 100 === 0)
|
|
gc();
|
|
}
|
|
gc();
|
|
|
|
if (weakRefs.find((weak) => weak.deref() === null) === undefined)
|
|
throw new Error("No weak ref value was collected");
|
|
asyncTestPassed();
|
|
}
|
|
|
|
test().catch(e => debug(e));
|