[Skylark] Size tuple slice sizes to avoid unnecessary allocations. Closes #5698. PiperOrigin-RevId: 206780174
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java index 15fb66a..541413f 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -319,7 +319,7 @@ for (Map.Entry<?, ?> entries : dict.entrySet()) { list.add(entries.getKey()); } - return ImmutableList.copyOf(list); + return ImmutableList.copyOf(list); } // For determinism, we sort the keys. try { @@ -512,7 +512,10 @@ } start = clampRangeEndpoint(start, length, step < 0); end = clampRangeEndpoint(end, length, step < 0); - ImmutableList.Builder<Integer> indices = ImmutableList.builder(); + // precise computation is slightly more involved, but since it can overshoot only by a single + // element it's fine + final int expectedMaxSize = Math.abs(start - end) / Math.abs(step) + 1; + ImmutableList.Builder<Integer> indices = ImmutableList.builderWithExpectedSize(expectedMaxSize); for (int current = start; step > 0 ? current < end : current > end; current += step) { indices.add(current); }