mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Fix optimization in use statement and match expression with _ matcher
This commit is contained in:
parent
94bbc05b93
commit
1abcffda5d
@ -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'
|
||||||
|
}
|
||||||
|
//
|
||||||
|
@ -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 "_";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@ -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)) {
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user