blob: b3f3ea45542fdbbf705947dee0995e9564849379 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
// |jit-test| skip-if: !('gc' in this) || !('clearKeptObjects' in this)
// Locals in async functions should not keep objects alive after going out of scope.
// Test by Mathieu Hofman.
let nextId = 0;
let weakRef;
let savedCallback;
const tests = [
function() {
let object = { id: ++nextId };
console.log(`created object ${object.id}`);
savedCallback = () => {};
weakRef = new WeakRef(object);
},
async function() {
let object = { id: ++nextId };
console.log(`created object ${object.id}`);
savedCallback = () => {};
weakRef = new WeakRef(object);
},
async function() {
function* gen() {
{
let object = { id: ++nextId };
console.log(`created object ${object.id}`);
// Yielding here stores the local variable `object` in the generator
// object.
yield 1;
weakRef = new WeakRef(object);
}
// Yielding here should clear it.
yield 2;
}
let iter = gen();
assertEq(iter.next().value, 1);
assertEq(iter.next().value, 2);
savedCallback = iter; // Keep the generator alive for GC.
}
];
(async () => {
for (const test of tests) {
await test();
assertEq(!!weakRef.deref(), true);
clearKeptObjects();
gc();
if (weakRef.deref()) {
throw new Error(`object ${nextId} was not collected`);
}
}
})();
|