diff --git a/src/com/annimon/ownlang/parser/optimization/ConstantFolding.java b/src/com/annimon/ownlang/parser/optimization/ConstantFolding.java index c8bad16..b0f06af 100644 --- a/src/com/annimon/ownlang/parser/optimization/ConstantFolding.java +++ b/src/com/annimon/ownlang/parser/optimization/ConstantFolding.java @@ -66,7 +66,6 @@ public class ConstantFolding extends OptimizationVisitor implements Optimi try { return new ValueExpression(s.eval()); } catch (OperationIsNotSupportedException op) { - System.err.println(s); binaryExpressionFoldingCount--; } } diff --git a/src/com/annimon/ownlang/parser/optimization/DeadCodeElimination.java b/src/com/annimon/ownlang/parser/optimization/DeadCodeElimination.java index 206f979..86c9e9e 100644 --- a/src/com/annimon/ownlang/parser/optimization/DeadCodeElimination.java +++ b/src/com/annimon/ownlang/parser/optimization/DeadCodeElimination.java @@ -2,13 +2,17 @@ package com.annimon.ownlang.parser.optimization; import com.annimon.ownlang.lib.Types; import com.annimon.ownlang.parser.ast.AssignmentExpression; +import com.annimon.ownlang.parser.ast.BlockStatement; import com.annimon.ownlang.parser.ast.ExprStatement; +import com.annimon.ownlang.parser.ast.Expression; import com.annimon.ownlang.parser.ast.IfStatement; import com.annimon.ownlang.parser.ast.Node; +import com.annimon.ownlang.parser.ast.Statement; import com.annimon.ownlang.parser.ast.TernaryExpression; import com.annimon.ownlang.parser.ast.ValueExpression; import com.annimon.ownlang.parser.ast.VariableExpression; import com.annimon.ownlang.parser.ast.WhileStatement; +import static com.annimon.ownlang.parser.visitors.VisitorUtils.isConstantValue; import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue; import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValueAsInt; import static com.annimon.ownlang.parser.visitors.VisitorUtils.isVariable; @@ -22,6 +26,7 @@ public class DeadCodeElimination extends OptimizationVisitor 0) { sb.append("\nEliminated WhileStatement: ").append(whileStatementEliminatedCount); } + if (whileStatementEliminatedCount > 0) { + sb.append("\nEliminated AssignmentExpression: ").append(assignmentExpressionEliminatedCount); + } return sb.toString(); } @@ -104,9 +112,37 @@ public class DeadCodeElimination extends OptimizationVisitor t) { + final BlockStatement result = new BlockStatement(); + boolean changed = false; + for (Statement statement : s.statements) { + final Node node = statement.accept(this, t); + if (node != statement) { + changed = true; + } + if (node instanceof ExprStatement + && isConstantValue( ((ExprStatement) node).expr )) { + changed = true; + continue; + } + + if (node instanceof Statement) { + result.add((Statement) node); + } else if (node instanceof Expression) { + result.add(new ExprStatement((Expression) node)); + } + } + if (changed) { + return result; + } + return super.visit(s, t); + } } diff --git a/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java b/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java index fcd2c5c..5ac7cab 100644 --- a/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java +++ b/src/com/annimon/ownlang/parser/optimization/OptimizationVisitor.java @@ -207,7 +207,8 @@ public abstract class OptimizationVisitor implements ResultVisitor { elseStatement = null; } if (expression != s.expression || ifStatement != s.ifStatement || elseStatement != s.elseStatement) { - return new IfStatement((Expression) expression, consumeStatement(ifStatement), consumeStatement(elseStatement)); + return new IfStatement((Expression) expression, consumeStatement(ifStatement), + (elseStatement == null ? null : consumeStatement(elseStatement)) ); } return s; }