Рефакторинг

This commit is contained in:
Victor 2016-06-26 11:21:24 +03:00
parent 357813ee76
commit 156675a75f
3 changed files with 31 additions and 35 deletions

View File

@ -76,14 +76,7 @@ public class ConstantPropagation implements Optimizer.Info {
} }
final String variableName = ((VariableExpression) s.target).name; final String variableName = ((VariableExpression) s.target).name;
final VariableInfo var; final VariableInfo var = variableInfo(t, variableName);
if (t.containsKey(variableName)) {
var = t.get(variableName);
var.modifications++;
} else {
var = new VariableInfo();
var.modifications = 1;
}
if (s.operation == null && isValue(s.expression)) { if (s.operation == null && isValue(s.expression)) {
var.value = ((ValueExpression) s.expression).value; var.value = ((ValueExpression) s.expression).value;
@ -96,16 +89,7 @@ public class ConstantPropagation implements Optimizer.Info {
public Node visit(DestructuringAssignmentStatement s, Map<String, VariableInfo> t) { public Node visit(DestructuringAssignmentStatement s, Map<String, VariableInfo> t) {
for (String variableName : s.variables) { for (String variableName : s.variables) {
if (variableName == null) continue; if (variableName == null) continue;
t.put(variableName, variableInfo(t, variableName));
final VariableInfo var;
if (t.containsKey(variableName)) {
var = t.get(variableName);
var.modifications++;
} else {
var = new VariableInfo();
var.modifications = 1;
}
t.put(variableName, var);
} }
return super.visit(s, t); return super.visit(s, t);
} }
@ -114,15 +98,7 @@ public class ConstantPropagation implements Optimizer.Info {
public Node visit(FunctionDefineStatement s, Map<String, VariableInfo> t) { public Node visit(FunctionDefineStatement s, Map<String, VariableInfo> t) {
for (Argument argument : s.arguments) { for (Argument argument : s.arguments) {
final String variableName = argument.getName(); final String variableName = argument.getName();
final VariableInfo var; t.put(variableName, variableInfo(t, variableName));
if (t.containsKey(variableName)) {
var = t.get(variableName);
var.modifications++;
} else {
var = new VariableInfo();
var.modifications = 1;
}
t.put(variableName, var);
} }
return super.visit(s, t); return super.visit(s, t);
} }
@ -132,6 +108,18 @@ public class ConstantPropagation implements Optimizer.Info {
// no visit match expression // no visit match expression
return s; return s;
} }
private VariableInfo variableInfo(Map<String, VariableInfo> 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<Map<String, Value>> { private class VariablesPropagator extends OptimizationVisitor<Map<String, Value>> {

View File

@ -5,8 +5,9 @@ import com.annimon.ownlang.parser.ast.ExprStatement;
import com.annimon.ownlang.parser.ast.IfStatement; import com.annimon.ownlang.parser.ast.IfStatement;
import com.annimon.ownlang.parser.ast.Node; import com.annimon.ownlang.parser.ast.Node;
import com.annimon.ownlang.parser.ast.TernaryExpression; import com.annimon.ownlang.parser.ast.TernaryExpression;
import com.annimon.ownlang.parser.ast.ValueExpression;
import com.annimon.ownlang.parser.ast.WhileStatement; 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. * Performs dead code elimination.
@ -41,7 +42,7 @@ public class DeadCodeElimination extends OptimizationVisitor<Void> implements Op
@Override @Override
public Node visit(IfStatement s, Void t) { public Node visit(IfStatement s, Void t) {
if (s.expression instanceof ValueExpression) { if (isValue(s.expression)) {
ifStatementEliminatedCount++; ifStatementEliminatedCount++;
// true statement // true statement
if (s.expression.eval().asInt() != 0) { if (s.expression.eval().asInt() != 0) {
@ -58,7 +59,7 @@ public class DeadCodeElimination extends OptimizationVisitor<Void> implements Op
@Override @Override
public Node visit(TernaryExpression s, Void t) { public Node visit(TernaryExpression s, Void t) {
if (s.condition instanceof ValueExpression) { if (isValue(s.condition)) {
ternaryExpressionEliminatedCount++; ternaryExpressionEliminatedCount++;
if (s.condition.eval().asInt() != 0) { if (s.condition.eval().asInt() != 0) {
return s.trueExpr; return s.trueExpr;
@ -70,11 +71,9 @@ public class DeadCodeElimination extends OptimizationVisitor<Void> implements Op
@Override @Override
public Node visit(WhileStatement s, Void t) { public Node visit(WhileStatement s, Void t) {
if (s.condition instanceof ValueExpression) { if (isValueAsInt(s.condition, 0)) {
if (s.condition.eval().asInt() == 0) { whileStatementEliminatedCount++;
whileStatementEliminatedCount++; return new ExprStatement(s.condition);
return new ExprStatement(s.condition);
}
} }
return super.visit(s, t); return super.visit(s, t);
} }

View File

@ -47,6 +47,15 @@ public final class VisitorUtils {
return false; 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) { public static boolean isSameVariables(Node n1, Node n2) {
if (isVariable(n1) && isVariable(n2)) { if (isVariable(n1) && isVariable(n2)) {
final VariableExpression v1 = (VariableExpression) n1; final VariableExpression v1 = (VariableExpression) n1;