summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/resumption-08.js
blob: 044029584e2dbae9661fbcfe0b769d02beb99d38 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Check whether we respect resumption values when toggling debug mode on->off
// from various points with live scripts on the stack.

var g = newGlobal({newCompartment: true});
var dbg = new Debugger;

function reset() {
  dbg.onEnterFrame = undefined;
  dbg.onDebuggerStatement = undefined;
  dbg.addDebuggee(g);
  g.eval("(" + function test() {
    for (i = 0; i < 5; i++)
      f(42);
  } + ")();");
}

g.eval("" + function f(d) {
  return g(d);
});

g.eval("" + function g(d) {
  debugger;
  return d;
});

function testResumptionValues(handlerSetter) {
  // Test normal return.
  reset();
  handlerSetter(undefined);
  assertEq(g.eval("(" + function test() { return f(42); } + ")();"), 42);

  // Test forced return.
  reset();
  handlerSetter({ return: "not 42" });
  assertEq(g.eval("(" + function test() { return f(42); } + ")();"), "not 42");

  // Test throw.
  reset();
  handlerSetter({ throw: "thrown 42" });
  try {
    g.eval("(" + function test() { return f(42); } + ")();");;
  } catch (e) {
    assertEq(e, "thrown 42");
  }
}

// Turn off from within the prologue.
testResumptionValues(function (resumptionVal) {
  dbg.onEnterFrame = function (frame) {
    if (frame.older) {
      if (frame.older.older) {
        dbg.removeDebuggee(g);
        return resumptionVal;
      }
    }
  };
});

// Turn off from within the epilogue.
testResumptionValues(function (resumptionVal) {
  dbg.onEnterFrame = function (frame) {
    if (frame.older) {
      if (frame.older.older) {
        frame.onPop = function () {
          dbg.removeDebuggee(g);
          return resumptionVal;
        };
      }
    }
  };
});

// Turn off from within debugger statement handler.
testResumptionValues(function (resumptionVal) {
  dbg.onDebuggerStatement = function (frame) {
    dbg.removeDebuggee(g);
    return resumptionVal;
  };
});

// Turn off from within debug trap handler.
testResumptionValues(function (resumptionVal) {
  dbg.onEnterFrame = function (frame) {
    if (frame.older) {
      if (frame.older.older) {
        frame.onStep = function () {
          dbg.removeDebuggee(g);
          return resumptionVal;
        }
      }
    }
  };
});