diff --git a/runtime/src/main/java/dev/cel/runtime/planner/NamespacedAttribute.java b/runtime/src/main/java/dev/cel/runtime/planner/NamespacedAttribute.java index ed37eada1..d51336d80 100644 --- a/runtime/src/main/java/dev/cel/runtime/planner/NamespacedAttribute.java +++ b/runtime/src/main/java/dev/cel/runtime/planner/NamespacedAttribute.java @@ -77,8 +77,9 @@ public Object resolve(long exprId, GlobalResolver ctx, ExecutionFrame frame) { if (partialVars != null) { ImmutableList patterns = partialVars.unknowns(); - for (Qualifier qualifier : qualifiers) { - attr = attr.qualify(CelAttribute.Qualifier.fromGeneric(qualifier.value())); + // Avoid enhanced for loop to prevent UnmodifiableIterator from being allocated + for (int i = 0; i < qualifiers.size(); i++) { + attr = attr.qualify(CelAttribute.Qualifier.fromGeneric(qualifiers.get(i).value())); } CelAttributePattern partialMatch = findPartialMatchingPattern(attr, patterns).orElse(null); @@ -178,8 +179,9 @@ private static Object applyQualifiers( Object value, CelValueConverter celValueConverter, ImmutableList qualifiers) { Object obj = celValueConverter.toRuntimeValue(value); - for (Qualifier qualifier : qualifiers) { - obj = qualifier.qualify(obj); + // Avoid enhanced for loop to prevent UnmodifiableIterator from being allocated + for (int i = 0; i < qualifiers.size(); i++) { + obj = qualifiers.get(i).qualify(obj); } return celValueConverter.maybeUnwrap(obj); diff --git a/runtime/src/main/java/dev/cel/runtime/planner/RelativeAttribute.java b/runtime/src/main/java/dev/cel/runtime/planner/RelativeAttribute.java index 1ab2fa3e7..addbeb4d0 100644 --- a/runtime/src/main/java/dev/cel/runtime/planner/RelativeAttribute.java +++ b/runtime/src/main/java/dev/cel/runtime/planner/RelativeAttribute.java @@ -40,8 +40,9 @@ public Object resolve(long exprId, GlobalResolver ctx, ExecutionFrame frame) { obj = celValueConverter.toRuntimeValue(obj); - for (Qualifier qualifier : qualifiers) { - obj = qualifier.qualify(obj); + // Avoid enhanced for loop to prevent UnmodifiableIterator from being allocated + for (int i = 0; i < qualifiers.size(); i++) { + obj = qualifiers.get(i).qualify(obj); } return celValueConverter.maybeUnwrap(obj);