Fix optimization in use statement and match expression with _ matcher

This commit is contained in:
aNNiMON 2023-10-02 18:37:11 +03:00 committed by Victor Melnik
parent 94bbc05b93
commit 1abcffda5d
4 changed files with 39 additions and 32 deletions

View File

@ -47,3 +47,13 @@ tasks.register('runOptimizing', JavaExec) {
ignoreExitValue true ignoreExitValue true
args '-o 9 -m -a -f ../program.own'.split(' ') args '-o 9 -m -a -f ../program.own'.split(' ')
} }
tasks.register('runOptimizationDumper', JavaExec) {
group = "application"
description = "Run optmizer and dump results"
dependsOn classes
mainClass = 'com.annimon.ownlang.utils.OptimizationDumper'
classpath = sourceSets.main.runtimeClasspath
args '../program.own'
}
//

View File

@ -74,7 +74,7 @@ public final class MatchExpression extends InterruptableNode implements Expressi
final int size = array.size(); final int size = array.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
final Expression expr = p.values.get(i); final Expression expr = p.values.get(i);
if ( (expr != TuplePattern.ANY) && (expr.eval().compareTo(array.get(i)) != 0) ) { if ( (expr != ANY) && (expr.eval().compareTo(array.get(i)) != 0) ) {
return false; return false;
} }
} }
@ -279,8 +279,9 @@ public final class MatchExpression extends InterruptableNode implements Expressi
} }
return "()".concat(super.toString()); return "()".concat(super.toString());
} }
}
private static final Expression ANY = new Expression() { public static final Expression ANY = new Expression() {
@Override @Override
public Value eval() { public Value eval() {
return NumberValue.ONE; return NumberValue.ONE;
@ -297,8 +298,7 @@ public final class MatchExpression extends InterruptableNode implements Expressi
@Override @Override
public String toString() { public String toString() {
return "_".concat(super.toString()); return "_";
} }
}; };
}
} }

View File

@ -99,11 +99,6 @@ public class ConstantFolding extends OptimizationVisitor<Void> implements Optimi
return super.visit(s, t); return super.visit(s, t);
} }
@Override
public Node visit(UseStatement s, Void unused) {
return null;
}
@Override @Override
public Node visit(FunctionDefineStatement s, Void t) { public Node visit(FunctionDefineStatement s, Void t) {
if (OPERATORS.contains(s.name)) { if (OPERATORS.contains(s.name)) {

View File

@ -280,11 +280,13 @@ public abstract class OptimizationVisitor<T> implements ResultVisitor<Node, T> {
final List<Expression> newValues = new ArrayList<>(tuple.values.size()); final List<Expression> newValues = new ArrayList<>(tuple.values.size());
boolean valuesChanged = false; boolean valuesChanged = false;
for (Expression value : tuple.values) { for (Expression value : tuple.values) {
if (value != MatchExpression.ANY) {
final Node node = value.accept(this, t); final Node node = value.accept(this, t);
if (node != value) { if (node != value) {
valuesChanged = true; valuesChanged = true;
value = (Expression) node; value = (Expression) node;
} }
}
newValues.add(value); newValues.add(value);
} }
if (valuesChanged) { if (valuesChanged) {