bug1773650.js (1275B)
1 // This approach is based on async/debugger-reject-after-fulfill.js 2 function searchLastBreakpointBeforeReturn(declCode, callCode) { 3 const g = newGlobal({ newCompartment: true }); 4 const dbg = new Debugger(g); 5 g.eval(declCode); 6 7 let offset = 0; 8 dbg.onEnterFrame = function(frame) { 9 if (frame.callee && frame.callee.name == "f") { 10 frame.onStep = () => { 11 if (!g.returning) { 12 return undefined; 13 } 14 15 offset = frame.offset; 16 return undefined; 17 }; 18 } 19 }; 20 g.eval(callCode); 21 drainJobQueue(); 22 assertEq(offset != 0, true); 23 return offset; 24 } 25 26 let declaration = ` 27 var returning = false; 28 async function f() { 29 try { 30 throw undefined; 31 } catch (exc) { 32 try { 33 return (returning = true, "expected"); 34 } catch {} 35 } 36 }`; 37 let call = "var p = f();" 38 39 let offset = searchLastBreakpointBeforeReturn(declaration, call); 40 41 let g = newGlobal({ newCompartment: true }); 42 let dbg = new Debugger(g); 43 g.eval(declaration); 44 45 dbg.onEnterFrame = function(frame) { 46 if (frame.callee && frame.callee.name == "f") { 47 dbg.onEnterFrame = undefined; 48 frame.script.setBreakpoint(offset, { 49 hit() { 50 return { throw: "unexpected" }; 51 } 52 }); 53 } 54 }; 55 56 try { 57 g.eval(call); 58 } catch {}