forked from cel-expr/cel-cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevaluator_stack.cc
More file actions
92 lines (74 loc) · 3.26 KB
/
Copy pathevaluator_stack.cc
File metadata and controls
92 lines (74 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "eval/eval/evaluator_stack.h"
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <utility>
#include "absl/base/dynamic_annotations.h"
#include "absl/base/nullability.h"
#include "absl/log/absl_log.h"
#include "common/value.h"
#include "eval/eval/attribute_trail.h"
#include "internal/new.h"
namespace google::api::expr::runtime {
void EvaluatorStack::Grow() {
const size_t new_max_size = std::max(max_size() * 2, size_t{1});
ABSL_LOG(ERROR) << "evaluation stack is unexpectedly full: growing from "
<< max_size() << " to " << new_max_size
<< " as a last resort to avoid crashing: this should not "
"have happened so there must be a bug somewhere in "
"the planner or evaluator";
Reserve(new_max_size);
}
void EvaluatorStack::Reserve(size_t size) {
static_assert(alignof(cel::Value) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__);
static_assert(alignof(AttributeTrail) <= __STDCPP_DEFAULT_NEW_ALIGNMENT__);
if (max_size_ >= size) {
return;
}
void* absl_nullability_unknown data = cel::internal::New(SizeBytes(size));
cel::Value* absl_nullability_unknown values_begin =
reinterpret_cast<cel::Value*>(data);
cel::Value* absl_nullability_unknown values = values_begin;
AttributeTrail* absl_nullability_unknown attributes_begin =
reinterpret_cast<AttributeTrail*>(reinterpret_cast<uint8_t*>(data) +
AttributesBytesOffset(size));
AttributeTrail* absl_nullability_unknown attributes = attributes_begin;
if (max_size_ > 0) {
const size_t n = this->size();
const size_t m = std::min(n, size);
ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(values_begin, values_begin + size,
values_begin + size, values + m);
ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(attributes_begin,
attributes_begin + size,
attributes_begin + size, attributes + m);
for (size_t i = 0; i < m; ++i) {
::new (static_cast<void*>(values++))
cel::Value(std::move(values_begin_[i]));
::new (static_cast<void*>(attributes++))
AttributeTrail(std::move(attributes_begin_[i]));
}
std::destroy_n(values_begin_, n);
std::destroy_n(attributes_begin_, n);
ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(values_begin_, values_begin_ + max_size_,
values_, values_begin_ + max_size_);
ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(
attributes_begin_, attributes_begin_ + max_size_, attributes_,
attributes_begin_ + max_size_);
cel::internal::SizedDelete(data_, SizeBytes(max_size_));
} else {
ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(values_begin, values_begin + size,
values_begin + size, values);
ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(attributes_begin,
attributes_begin + size,
attributes_begin + size, attributes);
}
values_ = values;
values_begin_ = values_begin;
values_end_ = values_begin + size;
attributes_ = attributes;
attributes_begin_ = attributes_begin;
data_ = data;
max_size_ = size;
}
} // namespace google::api::expr::runtime