Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmDebuggingEnabled() || !hasFunction["gczeal"]
// A GC during an IndirectCallBadSig trap whose callee frame has been unwound
// must trace the caller's frame using the caller's stackmap.
var g = newGlobal({newCompartment: true});
var dbg = new Debugger(g);
g.bin = wasmTextToBinary(`(module
(type $callerT (func (result i32)))
(type $calleeT (func (param externref externref externref externref
externref externref externref externref
externref externref externref externref)
(result i32)))
(table funcref (elem $callee))
(func $callee (type $calleeT) (i32.const 1))
(func $middle (param externref) (result i32)
(call_indirect (type $callerT) (i32.const 0)))
(func (export "outer") (param externref) (result i32)
(call $middle (local.get 0))))`);
g.eval(`
var ins = new WebAssembly.Instance(new WebAssembly.Module(bin));
var caught = 0;
gczeal(2, 1);
for (var i = 0; i < 20; i++) {
try {
ins.exports.outer({});
} catch (e) {
caught++;
}
}
gczeal(0);
`);
assertEq(g.caught, 20);