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
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();
for (int i = 0; i < size; 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;
}
}
@ -279,26 +279,26 @@ public final class MatchExpression extends InterruptableNode implements Expressi
}
return "()".concat(super.toString());
}
private static final Expression ANY = new Expression() {
@Override
public Value eval() {
return NumberValue.ONE;
}
@Override
public void accept(Visitor visitor) {
}
@Override
public <R, T> R accept(ResultVisitor<R, T> visitor, T input) {
return null;
}
@Override
public String toString() {
return "_".concat(super.toString());
}
};
}
public static final Expression ANY = new Expression() {
@Override
public Value eval() {
return NumberValue.ONE;
}
@Override
public void accept(Visitor visitor) {
}
@Override
public <R, T> R accept(ResultVisitor<R, T> visitor, T input) {
return null;
}
@Override
public String toString() {
return "_";
}
};
}

View File

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

View File

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