diff options
Diffstat (limited to 'src/jdk/nashorn/internal/ir/debug/PrintVisitor.java')
-rw-r--r-- | src/jdk/nashorn/internal/ir/debug/PrintVisitor.java | 126 |
1 files changed, 95 insertions, 31 deletions
diff --git a/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java b/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java index 09af647d..52e9b663 100644 --- a/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java +++ b/src/jdk/nashorn/internal/ir/debug/PrintVisitor.java @@ -29,18 +29,25 @@ import java.util.List; import jdk.nashorn.internal.ir.BinaryNode; import jdk.nashorn.internal.ir.Block; import jdk.nashorn.internal.ir.BlockStatement; +import jdk.nashorn.internal.ir.BreakNode; import jdk.nashorn.internal.ir.CaseNode; import jdk.nashorn.internal.ir.CatchNode; +import jdk.nashorn.internal.ir.ContinueNode; import jdk.nashorn.internal.ir.ExpressionStatement; import jdk.nashorn.internal.ir.ForNode; import jdk.nashorn.internal.ir.FunctionNode; +import jdk.nashorn.internal.ir.IdentNode; import jdk.nashorn.internal.ir.IfNode; +import jdk.nashorn.internal.ir.JoinPredecessor; +import jdk.nashorn.internal.ir.JoinPredecessorExpression; import jdk.nashorn.internal.ir.LabelNode; import jdk.nashorn.internal.ir.LexicalContext; +import jdk.nashorn.internal.ir.LocalVariableConversion; import jdk.nashorn.internal.ir.Node; import jdk.nashorn.internal.ir.SplitNode; import jdk.nashorn.internal.ir.Statement; import jdk.nashorn.internal.ir.SwitchNode; +import jdk.nashorn.internal.ir.ThrowNode; import jdk.nashorn.internal.ir.TryNode; import jdk.nashorn.internal.ir.UnaryNode; import jdk.nashorn.internal.ir.VarNode; @@ -70,25 +77,30 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { /** Print line numbers */ private final boolean printLineNumbers; + /** Print inferred and optimistic types */ + private final boolean printTypes; + private int lastLineNumber = -1; /** * Constructor. */ public PrintVisitor() { - this(true); + this(true, true); } /** * Constructor * * @param printLineNumbers should line number nodes be included in the output? + * @param printTypes should we print optimistic and inferred types? */ - public PrintVisitor(final boolean printLineNumbers) { + public PrintVisitor(final boolean printLineNumbers, final boolean printTypes) { super(new LexicalContext()); this.EOLN = System.lineSeparator(); this.sb = new StringBuilder(); this.printLineNumbers = printLineNumbers; + this.printTypes = printTypes; } /** @@ -97,7 +109,7 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { * @param root a node from which to start printing code */ public PrintVisitor(final Node root) { - this(root, true); + this(root, true, true); } /** @@ -105,9 +117,10 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { * * @param root a node from which to start printing code * @param printLineNumbers should line numbers nodes be included in the output? + * @param printTypes should we print optimistic and inferred types? */ - public PrintVisitor(final Node root, final boolean printLineNumbers) { - this(printLineNumbers); + public PrintVisitor(final Node root, final boolean printLineNumbers, final boolean printTypes) { + this(printLineNumbers, printTypes); visit(root); } @@ -135,7 +148,28 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterDefault(final Node node) { - node.toString(sb); + node.toString(sb, printTypes); + return false; + } + + @Override + public boolean enterContinueNode(final ContinueNode node) { + node.toString(sb, printTypes); + printLocalVariableConversion(node); + return false; + } + + @Override + public boolean enterBreakNode(final BreakNode node) { + node.toString(sb, printTypes); + printLocalVariableConversion(node); + return false; + } + + @Override + public boolean enterThrowNode(final ThrowNode node) { + node.toString(sb, printTypes); + printLocalVariableConversion(node); return false; } @@ -148,9 +182,9 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { final List<Statement> statements = block.getStatements(); - for (final Node statement : statements) { - if (printLineNumbers && (statement instanceof Statement)) { - final int lineNumber = ((Statement)statement).getLineNumber(); + for (final Statement statement : statements) { + if (printLineNumbers) { + final int lineNumber = statement.getLineNumber(); sb.append('\n'); if (lineNumber != lastLineNumber) { indent(); @@ -162,10 +196,6 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { statement.accept(this); - if (statement instanceof FunctionNode) { - continue; - } - int lastIndex = sb.length() - 1; char lastChar = sb.charAt(lastIndex); while (Character.isWhitespace(lastChar) && lastIndex >= 0) { @@ -190,6 +220,7 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { sb.append(EOLN); indent(); sb.append('}'); + printLocalVariableConversion(block); return false; } @@ -211,13 +242,31 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { } @Override + public boolean enterJoinPredecessorExpression(final JoinPredecessorExpression expr) { + expr.getExpression().accept(this); + printLocalVariableConversion(expr); + return false; + } + + @Override + public boolean enterIdentNode(final IdentNode identNode) { + identNode.toString(sb, printTypes); + printLocalVariableConversion(identNode); + return true; + } + + private void printLocalVariableConversion(final JoinPredecessor joinPredecessor) { + LocalVariableConversion.toString(joinPredecessor.getLocalVariableConversion(), sb); + } + + @Override public boolean enterUnaryNode(final UnaryNode unaryNode) { unaryNode.toString(sb, new Runnable() { @Override public void run() { - unaryNode.rhs().accept(PrintVisitor.this); + unaryNode.getExpression().accept(PrintVisitor.this); } - }); + }, printTypes); return false; } @@ -229,21 +278,21 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterForNode(final ForNode forNode) { - forNode.toString(sb); + forNode.toString(sb, printTypes); forNode.getBody().accept(this); return false; } @Override public boolean enterFunctionNode(final FunctionNode functionNode) { - functionNode.toString(sb); + functionNode.toString(sb, printTypes); enterBlock(functionNode.getBody()); return false; } @Override public boolean enterIfNode(final IfNode ifNode) { - ifNode.toString(sb); + ifNode.toString(sb, printTypes); ifNode.getPass().accept(this); final Block fail = ifNode.getFail(); @@ -252,7 +301,12 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { sb.append(" else "); fail.accept(this); } - + if(ifNode.getLocalVariableConversion() != null) { + assert fail == null; + sb.append(" else "); + printLocalVariableConversion(ifNode); + sb.append(";"); + } return false; } @@ -261,15 +315,15 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { indent -= TABWIDTH; indent(); indent += TABWIDTH; - labeledNode.toString(sb); + labeledNode.toString(sb, printTypes); labeledNode.getBody().accept(this); - + printLocalVariableConversion(labeledNode); return false; } @Override public boolean enterSplitNode(final SplitNode splitNode) { - splitNode.toString(sb); + splitNode.toString(sb, printTypes); sb.append(EOLN); indent += TABWIDTH; indent(); @@ -287,7 +341,7 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterSwitchNode(final SwitchNode switchNode) { - switchNode.toString(sb); + switchNode.toString(sb, printTypes); sb.append(" {"); final List<CaseNode> cases = switchNode.getCases(); @@ -295,13 +349,20 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { for (final CaseNode caseNode : cases) { sb.append(EOLN); indent(); - caseNode.toString(sb); + caseNode.toString(sb, printTypes); + printLocalVariableConversion(caseNode); indent += TABWIDTH; caseNode.getBody().accept(this); indent -= TABWIDTH; sb.append(EOLN); } - + if(switchNode.getLocalVariableConversion() != null) { + sb.append(EOLN); + indent(); + sb.append("default: "); + printLocalVariableConversion(switchNode); + sb.append("{}"); + } sb.append(EOLN); indent(); sb.append("}"); @@ -311,14 +372,15 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterTryNode(final TryNode tryNode) { - tryNode.toString(sb); + tryNode.toString(sb, printTypes); + printLocalVariableConversion(tryNode); tryNode.getBody().accept(this); final List<Block> catchBlocks = tryNode.getCatchBlocks(); for (final Block catchBlock : catchBlocks) { final CatchNode catchNode = (CatchNode)catchBlock.getStatements().get(0); - catchNode.toString(sb); + catchNode.toString(sb, printTypes); catchNode.getBody().accept(this); } @@ -335,7 +397,8 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterVarNode(final VarNode varNode) { sb.append("var "); - varNode.getName().toString(sb); + varNode.getName().toString(sb, printTypes); + printLocalVariableConversion(varNode.getName()); final Node init = varNode.getInit(); if (init != null) { sb.append(" = "); @@ -347,13 +410,14 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterWhileNode(final WhileNode whileNode) { + printLocalVariableConversion(whileNode); if (whileNode.isDoWhile()) { sb.append("do"); whileNode.getBody().accept(this); sb.append(' '); - whileNode.toString(sb); + whileNode.toString(sb, printTypes); } else { - whileNode.toString(sb); + whileNode.toString(sb, printTypes); whileNode.getBody().accept(this); } @@ -362,7 +426,7 @@ public final class PrintVisitor extends NodeVisitor<LexicalContext> { @Override public boolean enterWithNode(final WithNode withNode) { - withNode.toString(sb); + withNode.toString(sb, printTypes); withNode.getBody().accept(this); return false; |