diff options
Diffstat (limited to 'src/jdk/nashorn/internal/ir/SplitNode.java')
-rw-r--r-- | src/jdk/nashorn/internal/ir/SplitNode.java | 175 |
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; - } } |