Skip to content

Commit 536698b

Browse files
jckingcopybara-github
authored andcommitted
Optimize EvaluatorStack
PiperOrigin-RevId: 742235956
1 parent a2394dd commit 536698b

5 files changed

Lines changed: 307 additions & 102 deletions

File tree

eval/eval/BUILD

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,20 @@ cc_test(
125125

126126
cc_library(
127127
name = "evaluator_stack",
128-
srcs = [
129-
"evaluator_stack.cc",
130-
],
131128
hdrs = [
132129
"evaluator_stack.h",
133130
],
134131
deps = [
135132
":attribute_trail",
136133
"//common:value",
134+
"//internal:align",
135+
"//internal:new",
137136
"@com_google_absl//absl/base:core_headers",
138-
"@com_google_absl//absl/log:absl_log",
137+
"@com_google_absl//absl/base:dynamic_annotations",
138+
"@com_google_absl//absl/base:nullability",
139+
"@com_google_absl//absl/log:absl_check",
140+
"@com_google_absl//absl/meta:type_traits",
141+
"@com_google_absl//absl/types:optional",
139142
"@com_google_absl//absl/types:span",
140143
],
141144
)

eval/eval/attribute_trail.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,19 @@ class AttributeTrail {
2929
explicit AttributeTrail(cel::Attribute attribute)
3030
: attribute_(std::move(attribute)) {}
3131

32+
// NOLINTNEXTLINE(google-explicit-constructor)
33+
AttributeTrail(absl::nullopt_t) : AttributeTrail() {}
34+
3235
AttributeTrail(const AttributeTrail&) = default;
3336
AttributeTrail& operator=(const AttributeTrail&) = default;
3437
AttributeTrail(AttributeTrail&&) = default;
3538
AttributeTrail& operator=(AttributeTrail&&) = default;
3639

40+
AttributeTrail& operator=(absl::nullopt_t) {
41+
attribute_.reset();
42+
return *this;
43+
}
44+
3745
// Creates AttributeTrail with attribute path incremented by "qualifier".
3846
AttributeTrail Step(cel::AttributeQualifier qualifier) const;
3947

eval/eval/comprehension_step.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ absl::Status ComprehensionNextStep::Evaluate1(ExecutionFrame* frame) const {
603603
if (!iter_range->Is<cel::ListValue>()) {
604604
if (iter_range->Is<cel::ErrorValue>() ||
605605
iter_range->Is<cel::UnknownValue>()) {
606-
frame->value_stack().PopAndPush(kStackSize, std::move(iter_range));
606+
frame->value_stack().SwapAndPop(/*n=*/kStackSize, /*i=*/POS_ITER_RANGE);
607607
} else {
608608
frame->value_stack().PopAndPush(
609609
kStackSize,
@@ -689,7 +689,7 @@ absl::Status ComprehensionNextStep::Evaluate2(ExecutionFrame* frame) const {
689689
ABSL_FALLTHROUGH_INTENDED;
690690
case ValueKind::kUnknown:
691691
// Leave it on the stack.
692-
frame->value_stack().PopAndPush(kStackSize, std::move(iter2_range));
692+
frame->value_stack().SwapAndPop(/*n=*/kStackSize, /*i=*/POS_ITER2_RANGE);
693693
return frame->JumpTo(error_jump_offset_);
694694
default:
695695
frame->value_stack().PopAndPush(
@@ -706,7 +706,7 @@ absl::Status ComprehensionNextStep::Evaluate2(ExecutionFrame* frame) const {
706706
case ValueKind::kError:
707707
ABSL_FALLTHROUGH_INTENDED;
708708
case ValueKind::kUnknown:
709-
frame->value_stack().PopAndPush(kStackSize, std::move(iter_range));
709+
frame->value_stack().SwapAndPop(/*n=*/kStackSize, /*i=*/POS_ITER_RANGE);
710710
return frame->JumpTo(error_jump_offset_);
711711
default:
712712
frame->value_stack().PopAndPush(
@@ -834,7 +834,7 @@ absl::Status ComprehensionCondStep::Evaluate1(ExecutionFrame* frame) const {
834834
if (!loop_condition_value->Is<cel::BoolValue>()) {
835835
if (loop_condition_value->Is<cel::ErrorValue>() ||
836836
loop_condition_value->Is<cel::UnknownValue>()) {
837-
frame->value_stack().PopAndPush(3, std::move(loop_condition_value));
837+
frame->value_stack().SwapAndPop(/*n=*/3, /*i=*/2);
838838
} else {
839839
frame->value_stack().PopAndPush(
840840
3,
@@ -872,7 +872,7 @@ absl::Status ComprehensionCondStep::Evaluate2(ExecutionFrame* frame) const {
872872
if (!loop_condition_value->Is<cel::BoolValue>()) {
873873
if (loop_condition_value->Is<cel::ErrorValue>() ||
874874
loop_condition_value->Is<cel::UnknownValue>()) {
875-
frame->value_stack().PopAndPush(4, std::move(loop_condition_value));
875+
frame->value_stack().SwapAndPop(/*n=*/4, /*i=*/3);
876876
} else {
877877
frame->value_stack().PopAndPush(
878878
4,

eval/eval/evaluator_stack.cc

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)