michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: var BUGNUMBER = 349331; michael@0: var summary = 'generator.close without GeneratorExit'; michael@0: var actual = ''; michael@0: var expect = ''; michael@0: michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: test(); michael@0: //----------------------------------------------------------------------------- michael@0: michael@0: function test() michael@0: { michael@0: enterFunc ('test'); michael@0: printBugNumber(BUGNUMBER); michael@0: printStatus (summary); michael@0: michael@0: var catch1, catch2, catch3, finally1, finally2, finally3; michael@0: var iter; michael@0: michael@0: function gen() michael@0: { michael@0: yield 1; michael@0: try { michael@0: try { michael@0: try { michael@0: yield 2; michael@0: } catch (e) { michael@0: catch1 = true; michael@0: } finally { michael@0: finally1 = true; michael@0: } michael@0: } catch (e) { michael@0: catch2 = true; michael@0: } finally { michael@0: finally2 = true; michael@0: } michael@0: } catch (e) { michael@0: catch3 = true; michael@0: } finally { michael@0: finally3 = true; michael@0: } michael@0: } michael@0: michael@0: // test explicit close call michael@0: catch1 = catch2 = catch3 = finally1 = finally2 = finally3 = false; michael@0: iter = gen(); michael@0: iter.next(); michael@0: iter.next(); michael@0: iter.close(); michael@0: michael@0: var passed = !catch1 && !catch2 && !catch3 && finally1 && finally2 && michael@0: finally3; michael@0: michael@0: if (!passed) { michael@0: print("Failed!"); michael@0: print("catch1=" + catch1 + " catch2=" + catch2 + " catch3=" + michael@0: catch3); michael@0: print("finally1=" + finally1 + " finally2=" + finally2 + michael@0: " finally3=" + finally3); michael@0: } michael@0: michael@0: reportCompare(true, passed, 'test explicit close call'); michael@0: michael@0: // test for-in invoked close michael@0: catch1 = catch2 = catch3 = finally1 = finally2 = finally3 = false; michael@0: iter = gen(); michael@0: for (var i in iter) { michael@0: if (i == 2) michael@0: break; michael@0: } michael@0: michael@0: var passed = !catch1 && !catch2 && !catch3 && finally1 && finally2 && michael@0: finally3; michael@0: michael@0: if (!passed) { michael@0: print("Failed!"); michael@0: print("catch1=" + catch1 + " catch2=" + catch2 + " catch3=" + michael@0: catch3); michael@0: print("finally1=" + finally1 + " finally2=" + finally2 + michael@0: " finally3="+finally3); michael@0: } michael@0: reportCompare(true, passed, 'test GC-invoke close'); michael@0: michael@0: reportCompare(expect, actual, summary); michael@0: michael@0: exitFunc ('test'); michael@0: }