Skip to content

Commit 6d6ecd4

Browse files
l46kokcopybara-github
authored andcommitted
Optimize scoped variable access using an unmodifiable map
PiperOrigin-RevId: 616901857
1 parent dd9ed38 commit 6d6ecd4

1 file changed

Lines changed: 11 additions & 12 deletions

File tree

runtime/src/main/java/dev/cel/runtime/DefaultInterpreter.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.google.auto.value.AutoValue;
2020
import com.google.common.base.Preconditions;
2121
import com.google.common.collect.ImmutableList;
22-
import com.google.common.collect.ImmutableMap;
2322
import com.google.errorprone.annotations.Immutable;
2423
import javax.annotation.concurrent.ThreadSafe;
2524
import dev.cel.common.CelAbstractSyntaxTree;
@@ -43,6 +42,7 @@
4342
import java.util.ArrayList;
4443
import java.util.Arrays;
4544
import java.util.Collection;
45+
import java.util.Collections;
4646
import java.util.HashMap;
4747
import java.util.HashSet;
4848
import java.util.LinkedHashMap;
@@ -852,14 +852,12 @@ private IntermediateResult evalComprehension(
852852
}
853853
i++;
854854

855-
ImmutableMap<String, IntermediateResult> loopVars =
856-
ImmutableMap.of(
857-
iterVar,
858-
IntermediateResult.create(iterAttr, RuntimeHelpers.maybeAdaptPrimitive(elem)),
859-
accuVar,
860-
accuValue);
855+
Map<String, IntermediateResult> loopVars = new HashMap<>();
856+
loopVars.put(
857+
iterVar, IntermediateResult.create(iterAttr, RuntimeHelpers.maybeAdaptPrimitive(elem)));
858+
loopVars.put(accuVar, accuValue);
861859

862-
frame.pushScope(loopVars);
860+
frame.pushScope(Collections.unmodifiableMap(loopVars));
863861
IntermediateResult evalObject = evalBooleanStrict(frame, compre.loopCondition());
864862
if (!isUnknownValue(evalObject.value()) && !(boolean) evalObject.value()) {
865863
frame.popScope();
@@ -869,7 +867,7 @@ private IntermediateResult evalComprehension(
869867
frame.popScope();
870868
}
871869

872-
frame.pushScope(ImmutableMap.of(accuVar, accuValue));
870+
frame.pushScope(Collections.singletonMap(accuVar, accuValue));
873871
IntermediateResult result = evalInternal(frame, compre.result());
874872
frame.popScope();
875873
return result;
@@ -878,14 +876,14 @@ private IntermediateResult evalComprehension(
878876
private IntermediateResult evalCelBlock(
879877
ExecutionFrame frame, CelExpr unusedExpr, CelCall blockCall) throws InterpreterException {
880878
CelCreateList exprList = blockCall.args().get(0).createList();
881-
ImmutableMap.Builder<String, IntermediateResult> blockList = ImmutableMap.builder();
879+
Map<String, IntermediateResult> blockList = new HashMap<>();
882880
for (int index = 0; index < exprList.elements().size(); index++) {
883881
// Register the block indices as lazily evaluated expressions stored as unique identifiers.
884882
blockList.put(
885883
"@index" + index,
886884
IntermediateResult.create(new LazyExpression(exprList.elements().get(index))));
887885
}
888-
frame.pushScope(blockList.buildOrThrow());
886+
frame.pushScope(Collections.unmodifiableMap(blockList));
889887

890888
return evalInternal(frame, blockCall.args().get(1));
891889
}
@@ -970,7 +968,8 @@ private void cacheLazilyEvaluatedResult(
970968
currentResolver.cacheLazilyEvaluatedResult(name, result);
971969
}
972970

973-
private void pushScope(ImmutableMap<String, IntermediateResult> scope) {
971+
/** Note: we utilize a HashMap instead of ImmutableMap to make lookups faster on string keys. */
972+
private void pushScope(Map<String, IntermediateResult> scope) {
974973
RuntimeUnknownResolver scopedResolver = currentResolver.withScope(scope);
975974
currentResolver = scopedResolver;
976975
resolvers.addLast(scopedResolver);

0 commit comments

Comments
 (0)