Skip to content

Commit 11deb62

Browse files
l46kokcopybara-github
authored andcommitted
Adapt the function dispatch result to allow for automatic Any unpacking
PiperOrigin-RevId: 647015250
1 parent 0e2fd64 commit 11deb62

File tree

3 files changed

+69
-4
lines changed

3 files changed

+69
-4
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,10 +411,11 @@ private IntermediateResult evalCall(ExecutionFrame frame, CelExpr expr, CelCall
411411

412412
Object[] argArray = Arrays.stream(argResults).map(IntermediateResult::value).toArray();
413413

414-
return IntermediateResult.create(
415-
attr,
414+
Object dispatchResult =
416415
dispatcher.dispatch(
417-
metadata, expr.id(), callExpr.function(), reference.overloadIds(), argArray));
416+
metadata, expr.id(), callExpr.function(), reference.overloadIds(), argArray);
417+
dispatchResult = typeProvider.adapt(dispatchResult);
418+
return IntermediateResult.create(attr, dispatchResult);
418419
}
419420

420421
private Optional<CelAttribute> maybeContainerIndexAttribute(
@@ -717,7 +718,7 @@ private IntermediateResult evalList(ExecutionFrame frame, CelExpr unusedExpr, Ce
717718
Object value = evaluatedElement.value();
718719
if (!optionalIndicesSet
719720
.isEmpty() // Performance optimization to prevent autoboxing when there's no
720-
// optionals.
721+
// optionals.
721722
&& optionalIndicesSet.contains(i)
722723
&& !isUnknownValue(value)) {
723724
Optional<?> optionalVal = (Optional<?>) value;

runtime/src/test/resources/packUnpackAny.baseline

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ declare d {
88
declare message {
99
value dev.cel.testing.testdata.proto3.TestAllTypes
1010
}
11+
declare list {
12+
value list(dyn)
13+
}
1114
=====>
1215
bindings: {d=seconds: 100
1316
} +> {any=type_url: "type.googleapis.com/google.protobuf.Duration"
@@ -25,6 +28,9 @@ declare d {
2528
declare message {
2629
value dev.cel.testing.testdata.proto3.TestAllTypes
2730
}
31+
declare list {
32+
value list(dyn)
33+
}
2834
=====>
2935
bindings: {message=single_any {
3036
type_url: "type.googleapis.com/google.protobuf.Duration"
@@ -45,6 +51,9 @@ declare d {
4551
declare message {
4652
value dev.cel.testing.testdata.proto3.TestAllTypes
4753
}
54+
declare list {
55+
value list(dyn)
56+
}
4857
=====>
4958
bindings: {message=single_any {
5059
type_url: "type.googleapis.com/google.protobuf.Duration"
@@ -64,6 +73,9 @@ declare d {
6473
declare message {
6574
value dev.cel.testing.testdata.proto3.TestAllTypes
6675
}
76+
declare list {
77+
value list(dyn)
78+
}
6779
=====>
6880
bindings: {any=single_int64: 1
6981
}
@@ -79,12 +91,38 @@ declare d {
7991
declare message {
8092
value dev.cel.testing.testdata.proto3.TestAllTypes
8193
}
94+
declare list {
95+
value list(dyn)
96+
}
8297
=====>
8398
bindings: {any=type_url: "type.googleapis.com/google.protobuf.Int64Value"
8499
value: "\b\001"
85100
}
86101
result: true
87102

103+
Source: list[0] == message
104+
declare any {
105+
value any
106+
}
107+
declare d {
108+
value google.protobuf.Duration
109+
}
110+
declare message {
111+
value dev.cel.testing.testdata.proto3.TestAllTypes
112+
}
113+
declare list {
114+
value list(dyn)
115+
}
116+
=====>
117+
bindings: {list=[type_url: "type.googleapis.com/dev.cel.testing.testdata.proto3.TestAllTypes"
118+
value: "\242\0062\n,type.googleapis.com/google.protobuf.Duration\022\002\bd"
119+
], message=single_any {
120+
type_url: "type.googleapis.com/google.protobuf.Duration"
121+
value: "\bd"
122+
}
123+
}
124+
result: true
125+
88126
Source: TestAllTypes{single_any: d}
89127
declare any {
90128
value any
@@ -95,6 +133,9 @@ declare d {
95133
declare message {
96134
value dev.cel.testing.testdata.proto3.TestAllTypes
97135
}
136+
declare list {
137+
value list(dyn)
138+
}
98139
=====>
99140
bindings: {d=seconds: 100
100141
}
@@ -114,6 +155,9 @@ declare d {
114155
declare message {
115156
value dev.cel.testing.testdata.proto3.TestAllTypes
116157
}
158+
declare list {
159+
value list(dyn)
160+
}
117161
=====>
118162
bindings: {message=single_int64: -1
119163
}
@@ -133,6 +177,9 @@ declare d {
133177
declare message {
134178
value dev.cel.testing.testdata.proto3.TestAllTypes
135179
}
180+
declare list {
181+
value list(dyn)
182+
}
136183
=====>
137184
bindings: {message=single_uint64: 1
138185
}
@@ -152,6 +199,9 @@ declare d {
152199
declare message {
153200
value dev.cel.testing.testdata.proto3.TestAllTypes
154201
}
202+
declare list {
203+
value list(dyn)
204+
}
155205
=====>
156206
bindings: {}
157207
result: single_any {
@@ -170,6 +220,9 @@ declare d {
170220
declare message {
171221
value dev.cel.testing.testdata.proto3.TestAllTypes
172222
}
223+
declare list {
224+
value list(dyn)
225+
}
173226
=====>
174227
bindings: {}
175228
result: single_any {
@@ -188,6 +241,9 @@ declare d {
188241
declare message {
189242
value dev.cel.testing.testdata.proto3.TestAllTypes
190243
}
244+
declare list {
245+
value list(dyn)
246+
}
191247
=====>
192248
bindings: {}
193249
result: single_any {
@@ -206,6 +262,9 @@ declare d {
206262
declare message {
207263
value dev.cel.testing.testdata.proto3.TestAllTypes
208264
}
265+
declare list {
266+
value list(dyn)
267+
}
209268
=====>
210269
bindings: {message=single_bytes: "happy"
211270
}

testing/src/main/java/dev/cel/testing/BaseInterpreterTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ public void packUnpackAny() throws Exception {
569569
declareVariable("any", CelTypes.ANY);
570570
declareVariable("d", CelTypes.DURATION);
571571
declareVariable("message", CelTypes.createMessage(TestAllTypes.getDescriptor().getFullName()));
572+
declareVariable("list", CelTypes.createList(CelTypes.DYN));
572573
Duration duration = Durations.fromSeconds(100);
573574
Any any = Any.pack(duration);
574575
TestAllTypes message = TestAllTypes.newBuilder().setSingleAny(any).build();
@@ -584,6 +585,10 @@ public void packUnpackAny() throws Exception {
584585
runTest(Activation.of("any", TestAllTypes.newBuilder().setSingleInt64(1).build()));
585586
source = "any == 1";
586587
runTest(Activation.of("any", Any.pack(Int64Value.of(1))));
588+
source = "list[0] == message";
589+
runTest(
590+
Activation.copyOf(
591+
ImmutableMap.of("list", ImmutableList.of(Any.pack(message)), "message", message)));
587592

588593
// pack any
589594
source = "TestAllTypes{single_any: d}";

0 commit comments

Comments
 (0)