summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/debug/wasm-onExceptionUnwind-gc.js
blob: 5f4b4942af098ad8b24986362b625b3856177456 (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
// |jit-test| skip-if: !wasmDebuggingEnabled()

var sandbox = newGlobal({newCompartment: true});
var dbg = new Debugger(sandbox);
var counter = 0;
dbg.onExceptionUnwind = (frame, value) => {
    if (frame.type !== "wasmcall")
        return;
    if (++counter != 2)
        return;
    gc();
};

sandbox.innerCode = wasmTextToBinary(`(module
    (import "imports" "tbl" (table 1 anyfunc))
    (import "imports" "setNull" (func $setNull))
    (func $trap
        call $setNull
        unreachable
    )
    (elem (i32.const 0) $trap)
)`);
sandbox.outerCode = wasmTextToBinary(`(module
    (import "imports" "tbl" (table 1 anyfunc))
    (type $v2v (func))
    (func (export "run")
        i32.const 0
        call_indirect (type $v2v)
    )
)`);

sandbox.eval(`
(function() {

var tbl = new WebAssembly.Table({initial:1, element:"anyfunc"});
function setNull() { tbl.set(0, null) }
new WebAssembly.Instance(new WebAssembly.Module(innerCode), {imports:{tbl,setNull}});
var outer = new WebAssembly.Instance(new WebAssembly.Module(outerCode), {imports:{tbl}});
var caught;
try {
    outer.exports.run();
} catch (e) {
    caught = e;
}
assertEq(caught instanceof WebAssembly.RuntimeError, true);

})();
`);