Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| skip-if: !wasmStackSwitchingEnabled()
// Tests that stack overflow inside a continuation propagates to the JS caller.
// Unbounded recursion inside the continuation.
{
let run = wasmEvalText(`(module
(type $ft (func))
(type $ct (cont $ft))
(func $recur (type $ft) call $recur)
(elem declare func $recur)
(func (export "run")
ref.func $recur
cont.new $ct
resume $ct
)
)`).exports.run;
assertErrorMessage(() => run(), InternalError, /too much recursion/);
}
// Stack overflow in the second segment, after a suspend/resume round-trip.
// The overflow happens on the re-entered continuation stack.
{
let { start, step } = wasmEvalText(`(module
(type $ft (func))
(type $ct (cont $ft))
(tag $tag)
(global $k (mut (ref null $ct)) (ref.null $ct))
(func $recur (type $ft) call $recur)
(func $f (type $ft)
suspend $tag
call $recur
)
(elem declare func $f)
(func (export "start")
ref.func $f
cont.new $ct
global.set $k
)
(func (export "step")
(block (result (ref $ct))
global.get $k
resume $ct (on $tag 0)
return
)
global.set $k
)
)`).exports;
start();
step();
assertErrorMessage(() => step(), InternalError, /too much recursion/);
}
// Stack overflow in a JS import called from a continuation.
{
function inf() { return inf(); }
let run = wasmEvalText(`(module
(import "env" "inf" (func $inf))
(type $ft (func))
(type $ct (cont $ft))
(func $f (type $ft) call $inf)
(elem declare func $f)
(func (export "run")
ref.func $f
cont.new $ct
resume $ct
)
)`, { env: { inf } }).exports.run;
assertErrorMessage(() => run(), InternalError, /too much recursion/);
}