Source code
Revision control
Copy as Markdown
Other Tools
// |jit-test| skip-if: !wasmJSPromiseIntegrationEnabled()
// Test WebAssembly.Suspending with callable proxies.
// Basic callable proxy as suspending function.
{
var target = async (x) => x + 1;
var calls = 0;
var handler = {
apply(target, thisArg, args) {
calls++;
return target.apply(thisArg, args);
}
};
var suspending = new WebAssembly.Suspending(new Proxy(target, handler));
var ins = wasmEvalText(`(module
(import "" "s" (func $s (param i32) (result i32)))
(func (export "f") (param i32) (result i32) (call $s (local.get 0)))
)`, {"": {s: suspending}});
var p = WebAssembly.promising(ins.exports.f);
p(41).then(r => {
assertEq(r, 42);
assertEq(calls, 1);
});
}
// Proxy that throws in apply trap.
{
var target = async () => 0;
var handler = {
apply() { throw new Error("proxy trap error"); }
};
var suspending = new WebAssembly.Suspending(new Proxy(target, handler));
var ins = wasmEvalText(`(module
(import "" "s" (func $s (result i32)))
(func (export "f") (result i32) call $s)
)`, {"": {s: suspending}});
var p = WebAssembly.promising(ins.exports.f);
p().then(
() => assertEq(true, false),
e => {
assertEq(e instanceof Error, true);
assertEq(e.message, "proxy trap error");
}
);
}
// Proxy returning a thenable.
{
var target = () => ({ then(resolve) { resolve(123); } });
var suspending = new WebAssembly.Suspending(new Proxy(target, {}));
var ins = wasmEvalText(`(module
(import "" "s" (func $s (result i32)))
(func (export "f") (result i32) call $s)
)`, {"": {s: suspending}});
var p = WebAssembly.promising(ins.exports.f);
p().then(r => assertEq(r, 123));
}
drainJobQueue();