summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/generators/yield-exception-stack-in-finally.js
blob: 6a1a0ef0063679f25b3c3df1870b1785205fbbc3 (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
load(libdir + "asserts.js");

var g = newGlobal({newCompartment: true})

// Throw an exception from a different compartment.
var thrower = g.Function(`
  throw 0;
`);

function* throwAndYield() {
  try {
    thrower();
  } finally {
    // The |finally| block is entered with the exception stack on the function
    // stack. The function stack is saved in the generator object when executing
    // |yield|, so the exception stack, which was created in a different
    // compartment, has to be wrapped into the current compartment.
    yield;
  }
}
assertThrowsValue(() => [...throwAndYield()], 0);

function* throwAndNuke() {
  try {
    thrower();
  } finally {
    // The function stack contains the wrapped exception stack when entering
    // the |finally| block. When nuking all CCWs it becomes a dead wrapper.
    nukeAllCCWs();
    yield;
  }
}
assertThrowsValue(() => [...throwAndNuke()], 0);