aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
diff options
context:
space:
mode:
authorGravatar michajlo <michajlo@google.com>2017-10-06 23:51:10 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-10-07 11:07:24 +0200
commit5f39475bb51f48182180e34e4310edb650bea462 (patch)
tree5871871083d066c96e4cd23e267acda933c9f01e /src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
parent38da0c2e6e082964e32e8646439cdec7cd50808f (diff)
Reduce iterator usage on hot code paths
Micro-optimize a few hot code paths which have a habit of iterating over short O(1)-access lists. RELNOTES: None PiperOrigin-RevId: 171347524
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index 133cc00fda..1b943ece94 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -192,11 +192,11 @@ public final class FuncallExpression extends Expression {
private final Expression function;
- private final List<Argument.Passed> arguments;
+ private final ImmutableList<Argument.Passed> arguments;
private final int numPositionalArgs;
- public FuncallExpression(Expression function, List<Argument.Passed> arguments) {
+ public FuncallExpression(Expression function, ImmutableList<Argument.Passed> arguments) {
this.function = Preconditions.checkNotNull(function);
this.arguments = Preconditions.checkNotNull(arguments);
this.numPositionalArgs = countPositionalArguments();
@@ -679,7 +679,10 @@ public final class FuncallExpression extends Expression {
// or star arguments, because the argument list was already validated by
// Argument#validateFuncallArguments, as called by the Parser,
// which should be the only place that build FuncallExpression-s.
- for (Argument.Passed arg : arguments) {
+ // Argument lists are typically short and functions are frequently called, so go by index
+ // (O(1) for ImmutableList) to avoid the iterator overhead.
+ for (int i = 0; i < arguments.size(); i++) {
+ Argument.Passed arg = arguments.get(i);
Object value = arg.getValue().eval(env);
if (arg.isPositional()) {
posargs.add(value);