Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmJSPromiseIntegrationEnabled()
// Test recursive promising: a suspending import calls back into a promising
// export of the same module.
// Simple recursion: suspending import calls promising export.
{
var ins;
var suspending = new WebAssembly.Suspending(async (n) => {
if (n <= 0) return 1;
return await WebAssembly.promising(ins.exports.f)(n - 1);
});
ins = wasmEvalText(`(module
(import "" "s" (func $s (param i32) (result i32)))
(func (export "f") (param i32) (result i32)
(i32.add (local.get 0) (call $s (local.get 0)))
)
)`, {"": {s: suspending}});
var p = WebAssembly.promising(ins.exports.f);
// f(3) = 3 + s(3) = 3 + f(2) = 3 + 2 + s(2) = 3 + 2 + f(1) = 3 + 2 + 1 + s(1) = 3 + 2 + 1 + f(0)
// f(0) = 0 + s(0) = 0 + 1 = 1
// f(1) = 1 + 1 = 2, f(2) = 2 + 2 = 4, f(3) = 3 + 4 = 7
p(3).then(r => assertEq(r, 7));
}
drainJobQueue();