Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !wasmJSPromiseIntegrationEnabled()
// Test concurrent promising calls, each with its own suspended continuation.
// Resolve in reverse order.
{
var resolvers = [];
var suspending = new WebAssembly.Suspending(function() {
return new Promise(r => resolvers.push(r));
});
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);
var results = [];
var count = 20;
for (var i = 0; i < count; i++) {
p().then(v => results.push(v));
}
gc();
for (var i = count - 1; i >= 0; i--) {
resolvers[i](i * 10);
drainJobQueue();
}
assertEq(results.length, count);
for (var i = 0; i < count; i++) {
assertEq(results[i], (count - 1 - i) * 10);
}
}
// Recursive promising: call promising while another call is suspended.
{
var resolvers = [];
var suspending = new WebAssembly.Suspending(function() {
return new Promise(r => resolvers.push(r));
});
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);
var results = [];
p().then(v => results.push(v));
p().then(v => results.push(v));
gc();
resolvers[1](200);
drainJobQueue();
resolvers[0](100);
drainJobQueue();
assertEq(results.length, 2);
assertEq(results[0], 200);
assertEq(results[1], 100);
}