Рефакторинг

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 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<String, VariableInfo> 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<String, VariableInfo> 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<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>> {

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.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<Void> 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<Void> 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<Void> 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);
}

View File

@ -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;