tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Frame-identity-06.js (1051B)


      1 // Debugger.Frames for async functions are not GC'd while they're suspended.
      2 // The awaited promise keeps the generator alive, via its reaction lists.
      3 
      4 var g = newGlobal({newCompartment: true});
      5 g.eval(`
      6    // Create a few promises.
      7    var promises = [], resolvers = [];
      8    for (let i = 0; i < 3; i++)
      9        promises.push(new Promise(r => { resolvers.push(r); }));
     10 
     11    async function f() {
     12        debugger;
     13        for (let p of promises) {
     14            await p;
     15            debugger;
     16        }
     17    }
     18 `);
     19 var dbg = new Debugger(g);
     20 var hits = 0;
     21 dbg.onDebuggerStatement = function (frame) {
     22    if (hits === 0)
     23        frame.seen = true;
     24    else
     25        assertEq(frame.seen, true);
     26    hits++;
     27 };
     28 
     29 let done = false;
     30 g.f().then(_ => { done = true; });
     31 gc();
     32 drainJobQueue();
     33 gc();
     34 
     35 // Resolve the promises one by one.
     36 for (let [i, resolve] of g.resolvers.entries()) {
     37    assertEq(hits, 1 + i);
     38    assertEq(done, false);
     39    resolve("x");
     40    gc();
     41    drainJobQueue();
     42    gc();
     43 }
     44 assertEq(hits, 1 + g.resolvers.length);
     45 assertEq(done, true);