blob: eea4e98a7b9cd8239eaaf3a0dc437ab00fef4266 [file] [log] [blame]
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
//-----------------------------------------------------------------------------
var BUGNUMBER = 349326;
var summary = 'closing generators';
var actual = 'PASS';
var expect = 'PASS';
//-----------------------------------------------------------------------------
test();
//-----------------------------------------------------------------------------
function test()
{
enterFunc ('test');
printBugNumber(BUGNUMBER);
printStatus (summary);
let closed;
function gen()
{
try {
yield 1;
yield 2;
} finally {
closed = true;
}
}
// Test that return closes the generator
function test_return()
{
for (let i in gen()) {
if (i != 1)
throw "unexpected generator value";
return 10;
}
}
closed = false;
test_return();
if (closed !== true)
throw "return does not close generator";
// test that break closes generator
closed = false;
for (let i in gen()) {
if (i != 1)
throw "unexpected generator value";
break;
}
if (closed !== true)
throw "break does not close generator";
label: {
for (;;) {
closed = false;
for (let i in gen()) {
if (i != 1)
throw "unexpected generator value";
break label;
}
}
}
if (closed !== true)
throw "break does not close generator";
// test that an exception closes generator
function function_that_throws()
{
throw function_that_throws;
}
try {
closed = false;
for (let i in gen()) {
if (i != 1)
throw "unexpected generator value";
function_that_throws();
}
} catch (e) {
if (e !== function_that_throws)
throw e;
}
if (closed !== true)
throw "exception does not close generator";
// Check consistency of finally execution in presence of generators
let gen2_was_closed = false;
let gen3_was_closed = false;
let finally_was_executed = false;
function gen2() {
try {
yield 2;
} finally {
if (gen2_was_closed || !finally_was_executed || !gen3_was_closed)
throw "bad oder of gen2 finally execution"
gen2_was_closed = true;
throw gen2;
}
}
function gen3() {
try {
yield 3;
} finally {
if (gen2_was_closed || finally_was_executed || gen3_was_closed)
throw "bad oder of gen3 finally execution"
gen3_was_closed = true;
}
}
label2: {
try {
for (let i in gen2()) {
try {
for (let j in gen3()) {
break label2;
}
} finally {
if (gen2_was_closed || finally_was_executed || !gen3_was_closed)
throw "bad oder of try-finally execution";
finally_was_executed = true;
}
}
throw "gen2 finally should throw";
} catch (e) {
if (e != gen2) throw e;
}
}
print("OK");
reportCompare(expect, actual, summary);
exitFunc ('test');
}