summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/generators/bug1542660.js
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`);
    }
  }
})();