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 values = [];
const iterator = {
[Symbol.iterator]: () => ({
i: 0,
return() {
values.push("return");
return { done: true };
},
next() {
return {
value: {
val: this.i++,
[Symbol.dispose]() {
values.push(this.val);
}
},
done: false
}
}
})
}
function testReturnsHappenAfterDisposal() {
for (using d of iterator) {
if (d.val === 3) {
break;
}
}
}
testReturnsHappenAfterDisposal();
assertArrayEq(values, [0, 1, 2, 3, "return"]);
}
{
const values = [];
function* iterator() {
let i = 0;
try {
while (true) {
yield {
val: i++,
[Symbol.dispose]() {
values.push(this.val);
}
};
}
} finally {
values.push("return");
}
}
function testReturnsHappenAfterDisposalWithGeneratorWithFinally() {
for (using d of iterator()) {
if (d.val === 3) {
break;
}
}
}
testReturnsHappenAfterDisposalWithGeneratorWithFinally();
assertArrayEq(values, [0, 1, 2, 3, "return"]);
}
{
const values = [];
function* iterator() {
let i = 0;
while (true) {
yield {
val: i++,
[Symbol.dispose]() {
values.push(this.val);
}
};
}
}
function testReturnsHappenAfterDisposalWithGeneratorWithCustomReturn() {
const iter = iterator();
iter.return = function () {
values.push("return");
return { done: true };
};
for (using d of iter) {
if (d.val === 3) {
break;
}
}
}
testReturnsHappenAfterDisposalWithGeneratorWithCustomReturn();
assertArrayEq(values, [0, 1, 2, 3, "return"]);
}
{
const values = [];
const iterator = {
[Symbol.iterator]: () => ({
i: 0,
return() {
values.push("return");
return { done: true };
},
next() {
return {
value: {
val: this.i++,
[Symbol.dispose]() {
values.push(this.val);
}
},
done: false
}
}
})
}
function testReturnsHappenAfterDisposalWithLabels() {
outer: for (let action of ['continue', 'break']) {
for (using d of iterator) {
const toJump = d.val === 3;
switch (action) {
case 'continue':
if (toJump) {
{
let a = 0, b = () => a;
continue outer;
}
}
break;
case 'break':
if (toJump) {
{
let a = 0, b = () => a;
break outer;
}
}
break;
}
}
}
}
testReturnsHappenAfterDisposalWithLabels();
assertArrayEq(values, [0,1,2,3,"return",0,1,2,3,"return"]);
}