diff options
Diffstat (limited to 'js/src/tests/js1_8/genexps/regress-349326.js')
-rw-r--r-- | js/src/tests/js1_8/genexps/regress-349326.js | 148 |
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'); +} |