summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/noExecute-07.js
blob: a5b42473518ec5c7564b1ae3b6e3bbbe78b8fac4 (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
// Tests provenance of Debugger.DebuggeeWouldRun errors.

load(libdir + "asserts.js");
load(libdir + "debuggerNXHelper.js");

var g1 = newGlobal({newCompartment: true});
var g2 = newGlobal({newCompartment: true});
var g3 = newGlobal({newCompartment: true});
var dbg = new Debugger(g1);

g3.eval(`var dbg = new Debugger`);
var g1w = g3.dbg.addDebuggee(g1);
g3.dbg.addDebuggee(g2);

g1.eval(`function f() {}`);

function testHook(hookName) {
  // The stack is like so:
  //   g1 -> dbg (locks g1) -> g2 -> g3.dbg (locks g1 and g2)
  //
  // The DebuggeeWouldRun error is always allocated in the topmost locked
  // Debugger's compartment.

  // If we try to run script in g1 without going through one of g3.dbg's
  // invocation functions, we should get an error allocated in
  // g3.Debugger.DebuggeeWouldRun.
  assertThrowsInstanceOf(() => { g1.eval(`f()`); }, g3.Debugger.DebuggeeWouldRun);

  // If we try to run script in g1 via one of g3.dbg's invocation functions,
  // we should get an error allocated in Debugger.DebuggeeWouldRun.
  assertEq(g1w.executeInGlobal(`f()`).throw.unsafeDereference() instanceof Debugger.DebuggeeWouldRun, true);
}

testDebuggerHooksNX(dbg, g1, () => {
  testDebuggerHooksNX(g3.dbg, g2, testHook);
});