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. attila@962: * 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. attila@962: * 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). attila@962: * 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. attila@962: * 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) { attila@962: myvalue = 12; attila@962: 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) { attila@962: print(value); attila@962: value = 11; attila@962: print(value); attila@962: with (scope2) { attila@962: print(value); attila@962: value = 21; attila@962: print(value); attila@962: break; attila@962: } 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) { attila@962: with (scope) { attila@962: print(value); attila@962: value = 11; attila@962: print(value); attila@962: with (scope2) { attila@962: print(value); attila@962: value = 21; attila@962: print(value); attila@962: break; attila@962: } jlaskey@3: } attila@962: } attila@962: 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) { attila@962: with (scope) { attila@962: print(value); attila@962: value = 11; attila@962: print(value); attila@962: if (value > ten()) { attila@962: break; attila@962: } attila@962: } 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) { attila@962: var i=0; attila@962: while (i < 10) { attila@962: with(scope) { attila@962: print("loop header "+i); attila@962: with (scope2) { attila@962: value = 11; attila@962: i++; attila@962: if ((i & 1) != 0) { attila@962: print("continue"); attila@962: continue; attila@962: } attila@962: } attila@962: } attila@962: print(value); jlaskey@3: } attila@962: outer++; attila@962: } attila@962: } 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) { attila@962: print("loop header "+i); attila@962: with (scope) { attila@962: value = 11; attila@962: i++; attila@962: if ((i & 1) != 0) { attila@962: print("continue"); attila@962: continue; attila@962: } attila@962: } 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) { attila@962: var i=0; attila@962: while (i < 10) { attila@962: with(scope) { attila@962: print("loop header "+i); attila@962: with (scope2) { attila@962: value = 11; attila@962: i++; attila@962: if ((i & 1) != 0) { attila@962: print("continue"); attila@962: outer++; attila@962: continue outer_label; attila@962: } attila@962: } attila@962: } attila@962: print(value); jlaskey@3: } attila@962: } attila@962: } 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: { attila@962: var i=0; attila@962: while (i < 10) { attila@962: with(scope) { attila@962: print("loop header "+i); attila@962: with (scope2) { attila@962: value = 11; attila@962: i++; attila@962: if ((i & 1) != 0) { attila@962: print("break"); attila@962: break outer; attila@962: } attila@962: } attila@962: } attila@962: print(value); attila@962: } 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}; attila@962: var scope2 = {value:20}; jlaskey@3: var global = false; jlaskey@3: try { attila@962: with(scope) { attila@962: try { attila@962: print(value); attila@962: value = 4711; attila@962: print(value); attila@962: with(scope2) { attila@962: print(value); attila@962: value = 17; attila@962: print(value); attila@962: global = true; attila@962: throw "inner"; attila@962: } attila@962: } catch (ei) { attila@962: print(ei); attila@962: print(value); attila@962: if (global) { attila@962: throw "outer"; attila@962: } attila@962: } attila@962: } jlaskey@3: } catch (eo) { attila@962: print(eo); attila@962: 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: