summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/async/bug1773650.js
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 {}