mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Рефакторинг
This commit is contained in:
parent
357813ee76
commit
156675a75f
@ -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>> {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user