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