mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44: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 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>> {
|
||||||
|
@ -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,12 +71,10 @@ 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user