1919import com .google .auto .value .AutoValue ;
2020import com .google .common .base .Preconditions ;
2121import com .google .common .collect .ImmutableList ;
22- import com .google .common .collect .ImmutableMap ;
2322import com .google .errorprone .annotations .Immutable ;
2423import javax .annotation .concurrent .ThreadSafe ;
2524import dev .cel .common .CelAbstractSyntaxTree ;
4342import java .util .ArrayList ;
4443import java .util .Arrays ;
4544import java .util .Collection ;
45+ import java .util .Collections ;
4646import java .util .HashMap ;
4747import java .util .HashSet ;
4848import 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