From 156675a75f3cffb672ef787c160e008a8e905b5b Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 26 Jun 2016 11:21:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/visitors/ConstantPropagation.java | 42 +++++++------------ .../parser/visitors/DeadCodeElimination.java | 15 ++++--- .../ownlang/parser/visitors/VisitorUtils.java | 9 ++++ 3 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/com/annimon/ownlang/parser/visitors/ConstantPropagation.java b/src/com/annimon/ownlang/parser/visitors/ConstantPropagation.java index 41fa425..ca31242 100644 --- a/src/com/annimon/ownlang/parser/visitors/ConstantPropagation.java +++ b/src/com/annimon/ownlang/parser/visitors/ConstantPropagation.java @@ -76,14 +76,7 @@ public class ConstantPropagation implements Optimizer.Info { } final String variableName = ((VariableExpression) s.target).name; - final VariableInfo var; - if (t.containsKey(variableName)) { - var = t.get(variableName); - var.modifications++; - } else { - var = new VariableInfo(); - var.modifications = 1; - } + final VariableInfo var = variableInfo(t, variableName); if (s.operation == null && isValue(s.expression)) { var.value = ((ValueExpression) s.expression).value; @@ -96,16 +89,7 @@ public class ConstantPropagation implements Optimizer.Info { public Node visit(DestructuringAssignmentStatement s, Map t) { for (String variableName : s.variables) { if (variableName == null) continue; - - final VariableInfo var; - if (t.containsKey(variableName)) { - var = t.get(variableName); - var.modifications++; - } else { - var = new VariableInfo(); - var.modifications = 1; - } - t.put(variableName, var); + t.put(variableName, variableInfo(t, variableName)); } return super.visit(s, t); } @@ -114,15 +98,7 @@ public class ConstantPropagation implements Optimizer.Info { public Node visit(FunctionDefineStatement s, Map t) { for (Argument argument : s.arguments) { final String variableName = argument.getName(); - final VariableInfo var; - if (t.containsKey(variableName)) { - var = t.get(variableName); - var.modifications++; - } else { - var = new VariableInfo(); - var.modifications = 1; - } - t.put(variableName, var); + t.put(variableName, variableInfo(t, variableName)); } return super.visit(s, t); } @@ -132,6 +108,18 @@ public class ConstantPropagation implements Optimizer.Info { // no visit match expression return s; } + + private VariableInfo variableInfo(Map t, final String variableName) { + final VariableInfo var; + if (t.containsKey(variableName)) { + var = t.get(variableName); + var.modifications++; + } else { + var = new VariableInfo(); + var.modifications = 1; + } + return var; + } } private class VariablesPropagator extends OptimizationVisitor> { diff --git a/src/com/annimon/ownlang/parser/visitors/DeadCodeElimination.java b/src/com/annimon/ownlang/parser/visitors/DeadCodeElimination.java index 8ae8855..f40729e 100644 --- a/src/com/annimon/ownlang/parser/visitors/DeadCodeElimination.java +++ b/src/com/annimon/ownlang/parser/visitors/DeadCodeElimination.java @@ -5,8 +5,9 @@ import com.annimon.ownlang.parser.ast.ExprStatement; import com.annimon.ownlang.parser.ast.IfStatement; import com.annimon.ownlang.parser.ast.Node; import com.annimon.ownlang.parser.ast.TernaryExpression; -import com.annimon.ownlang.parser.ast.ValueExpression; import com.annimon.ownlang.parser.ast.WhileStatement; +import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue; +import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValueAsInt; /** * Performs dead code elimination. @@ -41,7 +42,7 @@ public class DeadCodeElimination extends OptimizationVisitor implements Op @Override public Node visit(IfStatement s, Void t) { - if (s.expression instanceof ValueExpression) { + if (isValue(s.expression)) { ifStatementEliminatedCount++; // true statement if (s.expression.eval().asInt() != 0) { @@ -58,7 +59,7 @@ public class DeadCodeElimination extends OptimizationVisitor implements Op @Override public Node visit(TernaryExpression s, Void t) { - if (s.condition instanceof ValueExpression) { + if (isValue(s.condition)) { ternaryExpressionEliminatedCount++; if (s.condition.eval().asInt() != 0) { return s.trueExpr; @@ -70,11 +71,9 @@ public class DeadCodeElimination extends OptimizationVisitor implements Op @Override public Node visit(WhileStatement s, Void t) { - if (s.condition instanceof ValueExpression) { - if (s.condition.eval().asInt() == 0) { - whileStatementEliminatedCount++; - return new ExprStatement(s.condition); - } + if (isValueAsInt(s.condition, 0)) { + whileStatementEliminatedCount++; + return new ExprStatement(s.condition); } return super.visit(s, t); } diff --git a/src/com/annimon/ownlang/parser/visitors/VisitorUtils.java b/src/com/annimon/ownlang/parser/visitors/VisitorUtils.java index 50cb9f6..2a8bed0 100644 --- a/src/com/annimon/ownlang/parser/visitors/VisitorUtils.java +++ b/src/com/annimon/ownlang/parser/visitors/VisitorUtils.java @@ -47,6 +47,15 @@ public final class VisitorUtils { return false; } + public static boolean isValueAsInt(Node node, int valueToCheck) { + if (!isValue(node)) return false; + + final Value value = ((ValueExpression) node).value; + if (value.type() != Types.NUMBER) return false; + + return value.asInt() == valueToCheck; + } + public static boolean isSameVariables(Node n1, Node n2) { if (isVariable(n1) && isVariable(n2)) { final VariableExpression v1 = (VariableExpression) n1;