Source code

Revision control

Copy as Markdown

Other Tools

// |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 funcref))
(import "imports" "setNull" (func $setNull))
(func $trap
call $setNull
unreachable
)
(elem (i32.const 0) $trap)
)`);
sandbox.outerCode = wasmTextToBinary(`(module
(import "imports" "tbl" (table 1 funcref))
(type $v2v (func))
(func (export "run")
i32.const 0
call_indirect (type $v2v)
)
)`);
sandbox.eval(`
(function() {
var tbl = new WebAssembly.Table({initial:1, element:"funcref"});
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);
})();
`);