Improved accuracy of Function.getPosition() after optimization.

This commit is contained in:
TomyLobo 2011-10-27 16:53:44 +02:00
parent 0ca66ce350
commit ef5fba0f05

View File

@ -76,19 +76,24 @@ public class Function extends Invokable {
public Invokable optimize() throws EvaluationException { public Invokable optimize() throws EvaluationException {
final Invokable[] optimizedArgs = new Invokable[args.length]; final Invokable[] optimizedArgs = new Invokable[args.length];
boolean optimizable = !method.isAnnotationPresent(Dynamic.class); boolean optimizable = !method.isAnnotationPresent(Dynamic.class);
int position = getPosition();
for (int i = 0; i < args.length; ++i) { for (int i = 0; i < args.length; ++i) {
final Invokable optimized = optimizedArgs[i] = args[i].optimize(); final Invokable optimized = optimizedArgs[i] = args[i].optimize();
if (!(optimized instanceof Constant)) { if (!(optimized instanceof Constant)) {
optimizable = false; optimizable = false;
} }
if (optimized.getPosition() < position) {
position = optimized.getPosition();
}
} }
if (optimizable) { if (optimizable) {
return new Constant(getPosition(), invoke()); return new Constant(position, invoke());
} }
else { else {
return new Function(getPosition(), method, optimizedArgs); return new Function(position, method, optimizedArgs);
} }
} }
} }