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);