Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmTailCallsEnabled()
// Basically try to assert that the instance is restored properly when
// performing an import call. We do this by accessing the instance once we get
// out of the tail call chain.
// In this pure form, this test can't test for stack overflow as we can't do a loop of
// imported functions without return_call_indirect and a table.
// TODO: Probably add a loop here with an indirect call
// TODO: More ballast will make it more likely that stack smashing is detected
var insh = wasmEvalText(`
(module
(global $glob (export "glob") (mut i32) (i32.const 12345678))
(func $h (export "h") (param i32) (result i32)
(local.get 0)))`);
var insg = wasmEvalText(`
(module
(import "insh" "h" (func $h (param i32) (result i32)))
(global $glob (export "glob") (mut i32) (i32.const 24680246))
(func $g (export "g") (param i32) (result i32)
(return_call $h (local.get 0))))`, {insh:insh.exports});
var insf = wasmEvalText(`
(module
(import "insg" "g" (func $g (param i32) (result i32)))
(global $glob (export "glob") (mut i32) (i32.const 36903690))
(func $f (export "f") (param i32) (result i32)
(return_call $g (local.get 0))))`, {insg:insg.exports});
var start = wasmEvalText(`
(module
(import "insf" "f" (func $f (param i32) (result i32)))
(global $glob (export "glob") (mut i32) (i32.const 480480480))
(func (export "run") (param i32) (result i32)
(i32.add (call $f (local.get 0)) (global.get $glob))))`, {insf:insf.exports});
assertEq(start.exports.run(37), 480480480 + 37);