Skip to content

Commit 51c6439

Browse files
committed
Удаление ненужных ExprStatement, исправлен NPE при оптимизации IfStatement
1 parent f796792 commit 51c6439

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

src/com/annimon/ownlang/parser/optimization/ConstantFolding.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public Node visit(BinaryExpression s, Void t) {
6666
try {
6767
return new ValueExpression(s.eval());
6868
} catch (OperationIsNotSupportedException op) {
69-
System.err.println(s);
7069
binaryExpressionFoldingCount--;
7170
}
7271
}

src/com/annimon/ownlang/parser/optimization/DeadCodeElimination.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import com.annimon.ownlang.lib.Types;
44
import com.annimon.ownlang.parser.ast.AssignmentExpression;
5+
import com.annimon.ownlang.parser.ast.BlockStatement;
56
import com.annimon.ownlang.parser.ast.ExprStatement;
7+
import com.annimon.ownlang.parser.ast.Expression;
68
import com.annimon.ownlang.parser.ast.IfStatement;
79
import com.annimon.ownlang.parser.ast.Node;
10+
import com.annimon.ownlang.parser.ast.Statement;
811
import com.annimon.ownlang.parser.ast.TernaryExpression;
912
import com.annimon.ownlang.parser.ast.ValueExpression;
1013
import com.annimon.ownlang.parser.ast.VariableExpression;
1114
import com.annimon.ownlang.parser.ast.WhileStatement;
15+
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isConstantValue;
1216
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
1317
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValueAsInt;
1418
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isVariable;
@@ -22,6 +26,7 @@ public class DeadCodeElimination extends OptimizationVisitor<Map<String, Variabl
2226
private int ifStatementEliminatedCount;
2327
private int ternaryExpressionEliminatedCount;
2428
private int whileStatementEliminatedCount;
29+
private int assignmentExpressionEliminatedCount;
2530

2631
@Override
2732
public Node optimize(Node node) {
@@ -32,7 +37,7 @@ public Node optimize(Node node) {
3237
@Override
3338
public int optimizationsCount() {
3439
return ifStatementEliminatedCount + ternaryExpressionEliminatedCount
35-
+ whileStatementEliminatedCount;
40+
+ whileStatementEliminatedCount + assignmentExpressionEliminatedCount;
3641
}
3742

3843
@Override
@@ -48,6 +53,9 @@ public String summaryInfo() {
4853
if (whileStatementEliminatedCount > 0) {
4954
sb.append("\nEliminated WhileStatement: ").append(whileStatementEliminatedCount);
5055
}
56+
if (whileStatementEliminatedCount > 0) {
57+
sb.append("\nEliminated AssignmentExpression: ").append(assignmentExpressionEliminatedCount);
58+
}
5159
return sb.toString();
5260
}
5361

@@ -104,9 +112,37 @@ public Node visit(AssignmentExpression s, Map<String, VariableInfo> t) {
104112
switch (info.value.type()) {
105113
case Types.NUMBER:
106114
case Types.STRING:
115+
assignmentExpressionEliminatedCount++;
107116
return new ValueExpression(info.value);
108117
default:
109118
return super.visit(s, t);
110119
}
111120
}
121+
122+
@Override
123+
public Node visit(BlockStatement s, Map<String, VariableInfo> t) {
124+
final BlockStatement result = new BlockStatement();
125+
boolean changed = false;
126+
for (Statement statement : s.statements) {
127+
final Node node = statement.accept(this, t);
128+
if (node != statement) {
129+
changed = true;
130+
}
131+
if (node instanceof ExprStatement
132+
&& isConstantValue( ((ExprStatement) node).expr )) {
133+
changed = true;
134+
continue;
135+
}
136+
137+
if (node instanceof Statement) {
138+
result.add((Statement) node);
139+
} else if (node instanceof Expression) {
140+
result.add(new ExprStatement((Expression) node));
141+
}
142+
}
143+
if (changed) {
144+
return result;
145+
}
146+
return super.visit(s, t);
147+
}
112148
}

src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,8 @@ public Node visit(IfStatement s, T t) {
207207
elseStatement = null;
208208
}
209209
if (expression != s.expression || ifStatement != s.ifStatement || elseStatement != s.elseStatement) {
210-
return new IfStatement((Expression) expression, consumeStatement(ifStatement), consumeStatement(elseStatement));
210+
return new IfStatement((Expression) expression, consumeStatement(ifStatement),
211+
(elseStatement == null ? null : consumeStatement(elseStatement)) );
211212
}
212213
return s;
213214
}

0 commit comments

Comments
 (0)