1 /* 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package jdk.nashorn.internal.ir; 27 28 import java.util.Arrays; 29 import java.util.List; 30 31 import jdk.nashorn.internal.codegen.Label; 32 import jdk.nashorn.internal.ir.annotations.Immutable; 33 34 /** 35 * This class represents a node from which control flow can execute 36 * a {@code break} statement 37 */ 38 @Immutable 39 public abstract class BreakableNode extends LexicalContextNode { 40 41 /** break label. */ 42 protected final Label breakLabel; 43 44 /** 45 * Constructor 46 * 47 * @param lineNumber line number 48 * @param token token 49 * @param finish finish 50 * @param breakLabel break label 51 */ 52 protected BreakableNode(final int lineNumber, final long token, final int finish, final Label breakLabel) { 53 super(lineNumber, token, finish); 54 this.breakLabel = breakLabel; 55 } 56 57 /** 58 * Copy constructor 59 * 60 * @param breakableNode source node 61 */ 62 protected BreakableNode(final BreakableNode breakableNode) { 63 super(breakableNode); 64 this.breakLabel = new Label(breakableNode.getBreakLabel()); 65 } 66 67 @Override 68 public abstract Node ensureUniqueLabels(final LexicalContext lc); 69 70 /** 71 * Check whether this can be broken out from without using a label, 72 * e.g. everything but Blocks, basically 73 * @return true if breakable without label 74 */ 75 protected boolean isBreakableWithoutLabel() { 76 return true; 77 } 78 79 /** 80 * Return the break label, i.e. the location to go to on break. 81 * @return the break label 82 */ 83 public Label getBreakLabel() { 84 return breakLabel; 85 } 86 87 /** 88 * Return the labels associated with this node. Breakable nodes that 89 * aren't LoopNodes only have a break label - the location immediately 90 * afterwards the node in code 91 * @return list of labels representing locations around this node 92 */ 93 public List<Label> getLabels() { 94 return Arrays.asList(breakLabel); 95 } 96 97 }