| asyncTestStart(1); |
| var objects = []; |
| var weakRefs = []; |
| var finalizerCalled = false; |
| var finalizationRegistry = new FinalizationRegistry(() => finalizerCalled = true); |
| function makeWeakRef() { return new WeakRef({ foo: 1 }); } |
| noInline(makeWeakRef); |
| |
| // At the time of writing this test standalone-pre.js prints newlines slightly differently from js-test-pre.js for async tests so we don't use the shouldBe helpers... |
| function assert(condition, msg = "") { |
| if (!condition) |
| throw new Error(msg); |
| } |
| |
| let loopCount = 1000; |
| function turnEventLoop() { |
| return new Promise(function(resolve) { |
| setTimeout(() => { |
| gc(); |
| resolve(); |
| }, 1); |
| }); |
| } |
| |
| var i; |
| async function test() { |
| for (let i = 0; i < loopCount; i++) { |
| let weak = makeWeakRef(); |
| weakRefs.push(weak); |
| objects.push(weak.deref()); |
| finalizationRegistry.register(weak.deref()); |
| } |
| |
| await turnEventLoop(); |
| |
| assert(finalizerCalled === false); |
| for (i = 0; i < loopCount; i++) |
| assert(weakRefs[i].deref() === objects[i], "failed on iteration: " + i); |
| |
| objects.length = 0; |
| objects = null; |
| |
| await turnEventLoop(); |
| // We need to turn the event loop again since FR may not have called the callback in the last turn. |
| await turnEventLoop(); |
| |
| assert(finalizerCalled === true); |
| assert(weakRefs.some((weakRef) => weakRef.deref() === undefined) === true); |
| |
| asyncTestPassed(); |
| } |
| |
| test().catch(e => debug(e)); |