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");
{
const disposed = [];
let wasStartedBeforeAwait = false;
let didEvaluatePrecedingBlockStatementsBeforeAwait = false;
let didEvaluateFollowingBlockStatementsBeforeAwait = false;
let allStatementsRanBeforeAwait = false;
async function testAwaitUsingCausesAnAwait(evaluateAwaitUsing) {
let isRunningBeforeAwait = true;
async function f() {
wasStartedBeforeAwait = isRunningBeforeAwait;
outer: {
didEvaluatePrecedingBlockStatementsBeforeAwait = isRunningBeforeAwait;
if (!evaluateAwaitUsing) break outer;
await using _ = {
[Symbol.asyncDispose]() {
disposed.push(1);
}
};
didEvaluateFollowingBlockStatementsBeforeAwait = isRunningBeforeAwait;
}
allStatementsRanBeforeAwait = isRunningBeforeAwait;
}
let p = f();
isRunningBeforeAwait = false;
await p;
}
testAwaitUsingCausesAnAwait(false);
drainJobQueue();
assertEq(wasStartedBeforeAwait, true);
assertEq(didEvaluatePrecedingBlockStatementsBeforeAwait, true);
assertEq(allStatementsRanBeforeAwait, true);
assertArrayEq(disposed, []);
wasStartedBeforeAwait = false;
didEvaluatePrecedingBlockStatementsBeforeAwait = false;
didEvaluateFollowingBlockStatementsBeforeAwait = false;
allStatementsRanBeforeAwait = false;
testAwaitUsingCausesAnAwait(true);
drainJobQueue();
assertEq(wasStartedBeforeAwait, true);
// the await using statement is supposed to cause an await right before the scope
// end thus the block statements should be evaluated synchronously until the scope end.
assertEq(didEvaluatePrecedingBlockStatementsBeforeAwait, true);
assertEq(didEvaluateFollowingBlockStatementsBeforeAwait, true);
assertEq(allStatementsRanBeforeAwait, false);
assertArrayEq(disposed, [1]);
}