blob: 8fcc3cf743d82b767470413527493d07753c050e (
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
54
55
56
57
58
|
// This approach is based on async/debugger-reject-after-fulfill.js
function searchLastBreakpointBeforeReturn(declCode, callCode) {
const g = newGlobal({ newCompartment: true });
const dbg = new Debugger(g);
g.eval(declCode);
let offset = 0;
dbg.onEnterFrame = function(frame) {
if (frame.callee && frame.callee.name == "f") {
frame.onStep = () => {
if (!g.returning) {
return undefined;
}
offset = frame.offset;
return undefined;
};
}
};
g.eval(callCode);
drainJobQueue();
assertEq(offset != 0, true);
return offset;
}
let declaration = `
var returning = false;
async function f() {
try {
throw undefined;
} catch (exc) {
try {
return (returning = true, "expected");
} catch {}
}
}`;
let call = "var p = f();"
let offset = searchLastBreakpointBeforeReturn(declaration, call);
let g = newGlobal({ newCompartment: true });
let dbg = new Debugger(g);
g.eval(declaration);
dbg.onEnterFrame = function(frame) {
if (frame.callee && frame.callee.name == "f") {
dbg.onEnterFrame = undefined;
frame.script.setBreakpoint(offset, {
hit() {
return { throw: "unexpected" };
}
});
}
};
try {
g.eval(call);
} catch {}
|