Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmStackSwitchingEnabled()
const target = wasmEvalText(`(module
(func (export "trap") (param i32) (result i32) unreachable))`).exports;
const runner = wasmEvalText(`(module
(type $ft (func (result i32)))
(type $ct (cont $ft))
(table $table (export "table") 1 (ref null $ft))
(global $k (mut (ref null $ct)) (ref.null $ct))
(func (export "capture")
(global.set $k (cont.new $ct (table.get $table (i32.const 0))))
(table.set $table (i32.const 0) (ref.null $ft)))
(func (export "run") (result i32) (resume $ct (global.get $k))))`).exports;
let entry = wasmEvalText(`(module
(import "" "target" (func $target (param i32) (result i32)))
(func (export "run") (result i32) (return_call $target (i32.const 1))))`,
{"": {target: target.trap}}).exports;
runner.table.set(0, entry.run);
runner.capture();
entry = null;
gczeal(14, 1);
assertErrorMessage(() => runner.run(), WebAssembly.RuntimeError, /unreachable/);