Source code

Revision control

Copy as Markdown

Other Tools

// |jit-test| skip-if: !getBuildConfiguration("explicit-resource-management"); --enable-explicit-resource-management
load(libdir + "asserts.js");
class CustomError extends Error {}
{
const values = [];
async function* gen() {
yield 1;
await using a = {
[Symbol.asyncDispose]() {
values.push("a");
}
}
yield 2;
await using b = {
[Symbol.asyncDispose]() {
values.push("b");
}
}
throw new CustomError();
yield 3;
}
let caught = false;
async function testDisposalDuringThrowInGenerator() {
let x = gen();
values.push((await x.next()).value);
values.push((await x.next()).value);
try {
await x.next();
} catch (e) {
assertEq(e instanceof CustomError, true);
caught = true;
}
}
testDisposalDuringThrowInGenerator();
drainJobQueue();
assertEq(caught, true);
assertArrayEq(values, [1, 2, "b", "a"]);
}
{
const values = [];
async function* gen() {
yield 1;
await using a = {
[Symbol.asyncDispose]() {
values.push("a");
}
}
yield 2;
await using b = {
[Symbol.asyncDispose]() {
values.push("b");
}
}
yield 3;
}
let caught = false;
async function testDisposalDuringForcedThrowInGenerator() {
let x = gen();
values.push((await x.next()).value);
values.push((await x.next()).value);
try {
// the generator was resumed right at the point where
// we have yield 2, and the throw statement is inserted right over
// there preventing the evaluation of `await using b`.
await x.throw(new CustomError());
} catch (e) {
assertEq(e instanceof CustomError, true);
caught = true;
}
}
testDisposalDuringForcedThrowInGenerator();
drainJobQueue();
assertEq(caught, true);
assertArrayEq(values, [1, 2, "a"]);
}