summaryrefslogtreecommitdiffstats
path: root/js/src/tests/js1_8/genexps/regress-349326.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/js1_8/genexps/regress-349326.js')
-rw-r--r--js/src/tests/js1_8/genexps/regress-349326.js148
1 files changed, 148 insertions, 0 deletions
diff --git a/js/src/tests/js1_8/genexps/regress-349326.js b/js/src/tests/js1_8/genexps/regress-349326.js
new file mode 100644
index 000000000..eea4e98a7
--- /dev/null
+++ b/js/src/tests/js1_8/genexps/regress-349326.js
@@ -0,0 +1,148 @@
+/* -*- 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');
+}