aboutsummaryrefslogtreecommitdiff
path: root/src/jdk/nashorn/internal/ir/SplitNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jdk/nashorn/internal/ir/SplitNode.java')
-rw-r--r--src/jdk/nashorn/internal/ir/SplitNode.java175
1 files changed, 31 insertions, 144 deletions
diff --git a/src/jdk/nashorn/internal/ir/SplitNode.java b/src/jdk/nashorn/internal/ir/SplitNode.java
index b751cdcb..49c4092f 100644
--- a/src/jdk/nashorn/internal/ir/SplitNode.java
+++ b/src/jdk/nashorn/internal/ir/SplitNode.java
@@ -25,99 +25,65 @@
package jdk.nashorn.internal.ir;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
import jdk.nashorn.internal.codegen.CompileUnit;
-import jdk.nashorn.internal.codegen.Label;
-import jdk.nashorn.internal.codegen.MethodEmitter;
-import jdk.nashorn.internal.ir.annotations.Ignore;
-import jdk.nashorn.internal.ir.annotations.Reference;
+import jdk.nashorn.internal.ir.annotations.Immutable;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
-
/**
* Node indicating code is split across classes.
*/
-public class SplitNode extends Node {
+@Immutable
+public class SplitNode extends LexicalContextNode {
/** Split node method name. */
private final String name;
/** Compilation unit. */
- private CompileUnit compileUnit;
-
- /** Method emitter for current method. */
- private MethodEmitter method;
-
- /** Method emitter for caller method. */
- private MethodEmitter caller;
-
- /** Containing function. */
- @Reference
- private final FunctionNode functionNode;
-
- /** A list of target labels in parent methods this split node may encounter. */
- @Ignore
- private final List<Label> externalTargets;
-
- /** True if this split node or any of its children contain a return statement. */
- private boolean hasReturn;
+ private final CompileUnit compileUnit;
/** Body of split code. */
- @Ignore
- private Node body;
+ private final Node body;
/**
* Constructor
*
- * @param name name of split node
- * @param functionNode function node to split in
- * @param body body of split code
+ * @param name name of split node
+ * @param body body of split code
+ * @param compileUnit compile unit to use for the body
*/
- public SplitNode(final String name, final FunctionNode functionNode, final Node body) {
+ public SplitNode(final String name, final Node body, final CompileUnit compileUnit) {
super(body.getSource(), body.getToken(), body.getFinish());
-
- this.name = name;
- this.functionNode = functionNode;
- this.body = body;
- this.externalTargets = new ArrayList<>();
+ this.name = name;
+ this.body = body;
+ this.compileUnit = compileUnit;
}
- private SplitNode(final SplitNode splitNode, final CopyState cs) {
+ private SplitNode(final SplitNode splitNode, final Node body) {
super(splitNode);
+ this.name = splitNode.name;
+ this.body = body;
+ this.compileUnit = splitNode.compileUnit;
+ }
- this.name = splitNode.name;
- this.functionNode = (FunctionNode)cs.existingOrSame(splitNode.functionNode);
- this.body = cs.existingOrCopy(splitNode.body);
- this.externalTargets = new ArrayList<>();
+ /**
+ * Get the body for this split node - i.e. the actual code it encloses
+ * @return body for split node
+ */
+ public Node getBody() {
+ return body;
}
- @Override
- protected Node copy(final CopyState cs) {
- return new SplitNode(this, cs);
+ private SplitNode setBody(final LexicalContext lc, final Node body) {
+ if (this.body == body) {
+ return this;
+ }
+ return Node.replaceInLexicalContext(lc, this, new SplitNode(this, body));
}
@Override
- public Node accept(final NodeVisitor visitor) {
- final CompileUnit saveCompileUnit = visitor.getCurrentCompileUnit();
- final MethodEmitter saveMethod = visitor.getCurrentMethodEmitter();
-
- setCaller(saveMethod);
-
- visitor.setCurrentCompileUnit(getCompileUnit());
- visitor.setCurrentMethodEmitter(getMethodEmitter());
-
- try {
- if (visitor.enterSplitNode(this) != null) {
- body = body.accept(visitor);
-
- return visitor.leaveSplitNode(this);
- }
- } finally {
- visitor.setCurrentCompileUnit(saveCompileUnit);
- visitor.setCurrentMethodEmitter(saveMethod);
+ public Node accept(final LexicalContext lc, final NodeVisitor visitor) {
+ if (visitor.enterSplitNode(this)) {
+ return visitor.leaveSplitNode(setBody(lc, body.accept(visitor)));
}
-
return this;
}
@@ -130,22 +96,6 @@ public class SplitNode extends Node {
}
/**
- * Get the method emitter of the caller for this split node
- * @return caller method emitter
- */
- public MethodEmitter getCaller() {
- return caller;
- }
-
- /**
- * Set the caller method emitter for this split node
- * @param caller method emitter
- */
- public void setCaller(final MethodEmitter caller) {
- this.caller = caller;
- }
-
- /**
* Get the name for this split node
* @return name
*/
@@ -161,67 +111,4 @@ public class SplitNode extends Node {
return compileUnit;
}
- /**
- * Set the compile unit for this split node
- * @param compileUnit compile unit
- */
- public void setCompileUnit(final CompileUnit compileUnit) {
- this.compileUnit = compileUnit;
- }
-
- /**
- * Get the method emitter for this split node
- * @return method emitter
- */
- public MethodEmitter getMethodEmitter() {
- return method;
- }
-
- /**
- * Set the method emitter for this split node
- * @param method method emitter
- */
- public void setMethodEmitter(final MethodEmitter method) {
- this.method = method;
- }
-
- /**
- * Get the function node this SplitNode splits
- * @return function node reference
- */
- public FunctionNode getFunctionNode() {
- return functionNode;
- }
-
- /**
- * Get the external targets for this SplitNode
- * @return list of external targets
- */
- public List<Label> getExternalTargets() {
- return Collections.unmodifiableList(externalTargets);
- }
-
- /**
- * Add an external target for this SplitNode
- * @param targetLabel target label
- */
- public void addExternalTarget(final Label targetLabel) {
- externalTargets.add(targetLabel);
- }
-
- /**
- * Check whether this SplitNode returns a value
- * @return true if return
- */
- public boolean hasReturn() {
- return hasReturn;
- }
-
- /**
- * Set whether this SplitNode returns a value or not
- * @param hasReturn true if return exists, false otherwise
- */
- public void setHasReturn(final boolean hasReturn) {
- this.hasReturn = hasReturn;
- }
}