aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/ir/LabelNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jdk/nashorn/internal/ir/LabelNode.java')
-rw-r--r--src/jdk/nashorn/internal/ir/LabelNode.java56
1 files changed, 33 insertions, 23 deletions
diff --git a/src/jdk/nashorn/internal/ir/LabelNode.java b/src/jdk/nashorn/internal/ir/LabelNode.java
index 9903c2b0..744ba54b 100644
--- a/src/jdk/nashorn/internal/ir/LabelNode.java
+++ b/src/jdk/nashorn/internal/ir/LabelNode.java
@@ -29,36 +29,44 @@ import jdk.nashorn.internal.ir.annotations.Immutable;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
/**
- * IR representation for a labeled statement.
+ * IR representation for a labeled statement. It implements JoinPredecessor to hold conversions that need to be effected
+ * when the block exits normally, but is also targeted by a break statement that might bring different local variable
+ * types to the join at the break point.
*/
@Immutable
-public final class LabelNode extends LexicalContextStatement {
+public final class LabelNode extends LexicalContextStatement implements JoinPredecessor {
+ private static final long serialVersionUID = 1L;
+
/** Label ident. */
- private final IdentNode label;
+ private final String labelName;
/** Statements. */
private final Block body;
+ private final LocalVariableConversion localVariableConversion;
+
/**
* Constructor
*
* @param lineNumber line number
* @param token token
* @param finish finish
- * @param label label identifier
+ * @param labelName label name
* @param body body of label node
*/
- public LabelNode(final int lineNumber, final long token, final int finish, final IdentNode label, final Block body) {
+ public LabelNode(final int lineNumber, final long token, final int finish, final String labelName, final Block body) {
super(lineNumber, token, finish);
- this.label = label;
+ this.labelName = labelName;
this.body = body;
+ this.localVariableConversion = null;
}
- private LabelNode(final LabelNode labelNode, final IdentNode label, final Block body) {
+ private LabelNode(final LabelNode labelNode, final String labelName, final Block body, final LocalVariableConversion localVariableConversion) {
super(labelNode);
- this.label = label;
- this.body = body;
+ this.labelName = labelName;
+ this.body = body;
+ this.localVariableConversion = localVariableConversion;
}
@Override
@@ -69,18 +77,15 @@ public final class LabelNode extends LexicalContextStatement {
@Override
public Node accept(final LexicalContext lc, final NodeVisitor<? extends LexicalContext> visitor) {
if (visitor.enterLabelNode(this)) {
- return visitor.leaveLabelNode(
- setLabel(lc, (IdentNode)label.accept(visitor)).
- setBody(lc, (Block)body.accept(visitor)));
+ return visitor.leaveLabelNode(setBody(lc, (Block)body.accept(visitor)));
}
return this;
}
@Override
- public void toString(final StringBuilder sb) {
- label.toString(sb);
- sb.append(':');
+ public void toString(final StringBuilder sb, final boolean printType) {
+ sb.append(labelName).append(':');
}
/**
@@ -101,22 +106,27 @@ public final class LabelNode extends LexicalContextStatement {
if (this.body == body) {
return this;
}
- return Node.replaceInLexicalContext(lc, this, new LabelNode(this, label, body));
+ return Node.replaceInLexicalContext(lc, this, new LabelNode(this, labelName, body, localVariableConversion));
}
/**
- * Get the identifier representing the label name
+ * Get the label name
* @return the label
*/
- public IdentNode getLabel() {
- return label;
+ public String getLabelName() {
+ return labelName;
+ }
+
+ @Override
+ public LocalVariableConversion getLocalVariableConversion() {
+ return localVariableConversion;
}
- private LabelNode setLabel(final LexicalContext lc, final IdentNode label) {
- if (this.label == label) {
+ @Override
+ public LabelNode setLocalVariableConversion(final LexicalContext lc, final LocalVariableConversion localVariableConversion) {
+ if(this.localVariableConversion == localVariableConversion) {
return this;
}
- return Node.replaceInLexicalContext(lc, this, new LabelNode(this, label, body));
+ return Node.replaceInLexicalContext(lc, this, new LabelNode(this, labelName, body, localVariableConversion));
}
-
}