blob: e0fd4e54a56d2ba32d5648399fe78aaafaffbf56 [file] [edit]
// Exercises the microtask call cache in the drain loop: more distinct callees
// than cache entries, closures sharing one executable, and a handler whose
// arity exceeds the fast path limit.
function shouldBe(actual, expected) {
if (actual !== expected)
throw new Error(`bad value: ${actual}, expected ${expected}`);
}
async function a1() { return 1; }
async function a2() { return await a1() + 1; }
async function a3() { return await a2() + 1; }
async function a4() { return await a3() + 1; }
async function a5() { return await a4() + 1; }
async function a6() { return await a5() + 1; }
async function a7() { return await a6() + 1; }
async function a8() { return await a7() + 1; }
async function a9() { return await a8() + 1; }
async function a10() { return await a9() + 1; }
async function a11() { return await a10() + 1; }
async function a12() { return await a11() + 1; }
function makeAdder(n) {
return async function adder() { return n + await a1(); };
}
const add10 = makeAdder(10);
const add20 = makeAdder(20);
const add30 = makeAdder(30);
const wideArity = (a, b, c, d, e, f, g, h) => a + 100;
async function test() {
shouldBe(await a12(), 12);
shouldBe(await add10(), 11);
shouldBe(await add20(), 21);
shouldBe(await add30(), 31);
shouldBe(await Promise.resolve(1).then(wideArity), 101);
shouldBe(await Promise.resolve(2).then(wideArity).then(add10), 11);
}
async function run() {
for (let i = 0; i < testLoopCount; i++)
await test();
}
let finished = false;
let error;
run().then(() => { finished = true; }, (e) => { error = e; });
drainMicrotasks();
if (error)
throw error;
if (!finished)
throw new Error("did not finish");