jlaskey@3: /* jlaskey@7: * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. jlaskey@3: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jlaskey@3: * jlaskey@3: * This code is free software; you can redistribute it and/or modify it jlaskey@3: * under the terms of the GNU General Public License version 2 only, as jlaskey@3: * published by the Free Software Foundation. jlaskey@3: * jlaskey@3: * This code is distributed in the hope that it will be useful, but WITHOUT jlaskey@3: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jlaskey@3: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jlaskey@3: * version 2 for more details (a copy is included in the LICENSE file that jlaskey@3: * accompanied this code). jlaskey@3: * jlaskey@3: * You should have received a copy of the GNU General Public License version jlaskey@3: * 2 along with this work; if not, write to the Free Software Foundation, jlaskey@3: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jlaskey@3: * jlaskey@3: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jlaskey@3: * or visit www.oracle.com if you need additional information or have any jlaskey@3: * questions. jlaskey@3: */ jlaskey@3: jlaskey@3: /** jlaskey@3: * NASHORN-19: with blocks in various scopes and breaking from them if they are inloops jlaskey@3: * (also continues) jlaskey@3: * jlaskey@3: * @test jlaskey@3: * @run jlaskey@3: */ jlaskey@3: jlaskey@3: jlaskey@3: var myvalue = "hello"; jlaskey@3: jlaskey@3: var myscope = { jlaskey@3: myvalue: 11 jlaskey@3: }; jlaskey@3: jlaskey@3: do { jlaskey@3: with(myscope) { jlaskey@3: myvalue = 12; jlaskey@3: break; jlaskey@3: } jlaskey@3: } while (false); jlaskey@3: jlaskey@3: if (myvalue != 'hello') { jlaskey@3: throw "expecting to be hello"; jlaskey@3: } else { jlaskey@3: print("value is 'hello' as expected"); jlaskey@3: } jlaskey@3: jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: function ten() { jlaskey@3: return 0xa; jlaskey@3: } jlaskey@3: jlaskey@3: //make sure the scope works outside functions too jlaskey@3: print("starting 0"); jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var scope2 = {value:20}; jlaskey@3: while (true) { jlaskey@3: with (scope) { jlaskey@3: print(value); jlaskey@3: value = 11; jlaskey@3: print(value); jlaskey@3: with (scope2) { jlaskey@3: print(value); jlaskey@3: value = 21; jlaskey@3: print(value); jlaskey@3: break; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: jlaskey@3: print(value); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: //two level scope jlaskey@3: function test1() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var scope2 = {value:20}; jlaskey@3: while (true) { jlaskey@3: with (scope) { jlaskey@3: print(value); jlaskey@3: value = 11; jlaskey@3: print(value); jlaskey@3: with (scope2) { jlaskey@3: print(value); jlaskey@3: value = 21; jlaskey@3: print(value); jlaskey@3: break; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: jlaskey@3: print(value); jlaskey@3: } jlaskey@3: jlaskey@3: //one level scope jlaskey@3: function test2() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: while (true) { jlaskey@3: with (scope) { jlaskey@3: print(value); jlaskey@3: value = 11; jlaskey@3: print(value); jlaskey@3: if (value > ten()) { jlaskey@3: break; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: print(value); jlaskey@3: } jlaskey@3: jlaskey@3: //continue two levels jlaskey@3: function test3() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var scope2 = {value:20}; jlaskey@3: var outer = 0; jlaskey@3: while (outer < 5) { jlaskey@3: var i=0; jlaskey@3: while (i < 10) { jlaskey@3: with(scope) { jlaskey@3: print("loop header "+i); jlaskey@3: with (scope2) { jlaskey@3: value = 11; jlaskey@3: i++; jlaskey@3: if ((i & 1) != 0) { jlaskey@3: print("continue"); jlaskey@3: continue; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: print(value); jlaskey@3: } jlaskey@3: outer++; jlaskey@3: } jlaskey@3: } jlaskey@3: jlaskey@3: //continue one level jlaskey@3: function test4() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var i=0; jlaskey@3: while (i < 10) { jlaskey@3: print("loop header "+i); jlaskey@3: with (scope) { jlaskey@3: value = 11; jlaskey@3: i++; jlaskey@3: if ((i & 1) != 0) { jlaskey@3: print("continue"); jlaskey@3: continue; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: print(value); jlaskey@3: } jlaskey@3: jlaskey@3: jlaskey@3: //labelled continue; jlaskey@3: function test5() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var scope2 = {value:20}; jlaskey@3: var outer = 0; jlaskey@3: outer_label: jlaskey@3: while (outer < 5) { jlaskey@3: var i=0; jlaskey@3: while (i < 10) { jlaskey@3: with(scope) { jlaskey@3: print("loop header "+i); jlaskey@3: with (scope2) { jlaskey@3: value = 11; jlaskey@3: i++; jlaskey@3: if ((i & 1) != 0) { jlaskey@3: print("continue"); jlaskey@3: outer++; jlaskey@3: continue outer_label; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: print(value); jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: jlaskey@3: //labelled break jlaskey@3: function test6() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var scope2 = {value:20}; jlaskey@3: outer: jlaskey@3: { jlaskey@3: var i=0; jlaskey@3: while (i < 10) { jlaskey@3: with(scope) { jlaskey@3: print("loop header "+i); jlaskey@3: with (scope2) { jlaskey@3: value = 11; jlaskey@3: i++; jlaskey@3: if ((i & 1) != 0) { jlaskey@3: print("break"); jlaskey@3: break outer; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: print(value); jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: jlaskey@3: //exceptions in one scope and then the other jlaskey@3: function test7() { jlaskey@3: var value = "hello"; jlaskey@3: var scope = {value:10}; jlaskey@3: var scope2 = {value:20}; jlaskey@3: var global = false; jlaskey@3: try { jlaskey@3: with(scope) { jlaskey@3: try { jlaskey@3: print(value); jlaskey@3: value = 4711; jlaskey@3: print(value); jlaskey@3: with(scope2) { jlaskey@3: print(value); jlaskey@3: value = 17; jlaskey@3: print(value); jlaskey@3: global = true; jlaskey@3: throw "inner"; jlaskey@3: } jlaskey@3: } catch (ei) { jlaskey@3: print(ei); jlaskey@3: print(value); jlaskey@3: if (global) { jlaskey@3: throw "outer"; jlaskey@3: } jlaskey@3: } jlaskey@3: } jlaskey@3: } catch (eo) { jlaskey@3: print(eo); jlaskey@3: print(value); jlaskey@3: } jlaskey@3: print(value); jlaskey@3: } jlaskey@3: jlaskey@3: jlaskey@3: print("starting 1"); jlaskey@3: test1(); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: print("starting 2"); jlaskey@3: test2(); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: print("starting 3"); jlaskey@3: test3(); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: print("starting 4"); jlaskey@3: test4(); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: print("starting 5"); jlaskey@3: test5(); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: print("starting 6"); jlaskey@3: test6(); jlaskey@3: print("\n"); jlaskey@3: jlaskey@3: print("starting 7"); jlaskey@3: test7(); jlaskey@3: print("\n"); jlaskey@3: