Pass down `Arena*` to `RepeatedPtrFieldBase::AddInternal`.
PiperOrigin-RevId: 807447572
diff --git a/rust/cpp_kernel/repeated.cc b/rust/cpp_kernel/repeated.cc
index 64ae9e1..a625204 100644
--- a/rust/cpp_kernel/repeated.cc
+++ b/rust/cpp_kernel/repeated.cc
@@ -134,8 +134,7 @@
google::protobuf::MessageLite* proto2_rust_RepeatedField_Message_add(
RepeatedPtrFieldBase* field, const google::protobuf::MessageLite* prototype) {
- return field->AddFromPrototype<GenericTypeHandler<google::protobuf::MessageLite>>(
- prototype);
+ return RustRepeatedMessageHelper::Add(*field, prototype);
}
void proto2_rust_RepeatedField_Message_clear(RepeatedPtrFieldBase* field) {
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc
index b53be36..4e9db75 100644
--- a/src/google/protobuf/extension_set.cc
+++ b/src/google/protobuf/extension_set.cc
@@ -659,7 +659,7 @@
}
return reinterpret_cast<internal::RepeatedPtrFieldBase*>(
extension->ptr.repeated_message_value)
- ->AddFromClassData<GenericTypeHandler<MessageLite>>(class_data);
+ ->AddFromClassData<GenericTypeHandler<MessageLite>>(arena_, class_data);
}
// Defined in extension_set_heavy.cc.
diff --git a/src/google/protobuf/generated_message_tctable_impl.h b/src/google/protobuf/generated_message_tctable_impl.h
index bd20af4..b0654ee 100644
--- a/src/google/protobuf/generated_message_tctable_impl.h
+++ b/src/google/protobuf/generated_message_tctable_impl.h
@@ -746,7 +746,7 @@
uint16_t type_card, TcParseTableBase::FieldAux aux);
static MessageLite* NewMessage(const TcParseTableBase* table, Arena* arena);
static MessageLite* AddMessage(const TcParseTableBase* table,
- RepeatedPtrFieldBase& field);
+ RepeatedPtrFieldBase& field, Arena* arena);
template <typename T>
static inline const T& GetFieldAtMaybeSplit(const void* x, size_t offset,
diff --git a/src/google/protobuf/generated_message_tctable_lite.cc b/src/google/protobuf/generated_message_tctable_lite.cc
index 14f0070..5176e11 100644
--- a/src/google/protobuf/generated_message_tctable_lite.cc
+++ b/src/google/protobuf/generated_message_tctable_lite.cc
@@ -631,9 +631,9 @@
}
MessageLite* TcParser::AddMessage(const TcParseTableBase* table,
- RepeatedPtrFieldBase& field) {
+ RepeatedPtrFieldBase& field, Arena* arena) {
return field.AddFromClassData<GenericTypeHandler<MessageLite>>(
- table->class_data);
+ arena, table->class_data);
}
template <typename TagType, bool group_coding, bool aux_is_table>
@@ -726,15 +726,16 @@
}
PROTOBUF_PREFETCH_WITH_OFFSET(ptr, 256);
SetCachedHasBitForRepeated(hasbits, data.hasbit_idx());
+ Arena* arena = msg->GetArena();
const auto expected_tag = UnalignedLoad<TagType>(ptr);
const auto aux = *table->field_aux(data.aux_idx());
auto& field = RefAt<RepeatedPtrFieldBase>(msg, data.offset());
- ABSL_DCHECK_EQ(field.GetArena(), msg->GetArena());
+ ABSL_DCHECK_EQ(field.GetArena(), arena);
const TcParseTableBase* inner_table =
aux_is_table ? aux.table : aux.message_default()->GetTcParseTable();
do {
ptr += sizeof(TagType);
- MessageLite* submsg = AddMessage(inner_table, field);
+ MessageLite* submsg = AddMessage(inner_table, field, arena);
const auto inner_loop = [&](const char* ptr) {
return ParseLoop(submsg, ptr, ctx, inner_table);
};
@@ -2751,7 +2752,7 @@
const char* ptr2 = ptr;
uint32_t next_tag;
do {
- MessageLite* value = AddMessage(inner_table, field);
+ MessageLite* value = AddMessage(inner_table, field, msg->GetArena());
const auto inner_loop = [&](const char* ptr) {
return ParseLoopPreserveNone(value, ptr, ctx, inner_table);
};
diff --git a/src/google/protobuf/repeated_ptr_field.h b/src/google/protobuf/repeated_ptr_field.h
index b1985bf..6c10eed 100644
--- a/src/google/protobuf/repeated_ptr_field.h
+++ b/src/google/protobuf/repeated_ptr_field.h
@@ -207,17 +207,17 @@
}
template <typename TypeHandler>
- Value<TypeHandler>* Add() {
- return cast<TypeHandler>(AddInternal(TypeHandler::GetNewFunc()));
+ Value<TypeHandler>* Add(Arena* arena) {
+ return cast<TypeHandler>(AddInternal(arena, TypeHandler::GetNewFunc()));
}
template <typename TypeHandler>
- void Add(Value<TypeHandler>&& value) {
+ void Add(Arena* arena, Value<TypeHandler>&& value) {
if (ClearedCount() > 0) {
*cast<TypeHandler>(element_at(ExchangeCurrentSize(current_size_ + 1))) =
std::move(value);
} else {
- AddInternal(TypeHandler::GetNewWithMoveFunc(std::move(value)));
+ AddInternal(arena, TypeHandler::GetNewWithMoveFunc(std::move(value)));
}
}
@@ -285,10 +285,10 @@
// Pre-condition: `prototype` must not be nullptr.
template <typename TypeHandler>
PROTOBUF_ALWAYS_INLINE Value<TypeHandler>* AddFromPrototype(
- const Value<TypeHandler>* prototype) {
+ Arena* arena, const Value<TypeHandler>* prototype) {
using H = CommonHandler<TypeHandler>;
- Value<TypeHandler>* result =
- cast<TypeHandler>(AddInternal(H::GetNewFromPrototypeFunc(prototype)));
+ Value<TypeHandler>* result = cast<TypeHandler>(
+ AddInternal(arena, H::GetNewFromPrototypeFunc(prototype)));
return result;
}
@@ -301,10 +301,10 @@
// Pre-condition: `class_data` must not be nullptr.
template <typename TypeHandler>
PROTOBUF_ALWAYS_INLINE Value<TypeHandler>* AddFromClassData(
- const ClassData* class_data) {
+ Arena* arena, const ClassData* class_data) {
using H = CommonHandler<TypeHandler>;
- Value<TypeHandler>* result =
- cast<TypeHandler>(AddInternal(H::GetNewFromClassDataFunc(class_data)));
+ Value<TypeHandler>* result = cast<TypeHandler>(
+ AddInternal(arena, H::GetNewFromClassDataFunc(class_data)));
return result;
}
@@ -758,7 +758,7 @@
// Common implementation used by various Add* methods. `factory` is an object
// used to construct a new element unless there are spare cleared elements
// ready for reuse. Returns pointer to the new element.
- void* AddInternal(absl::FunctionRef<ElementNewFn> factory);
+ void* AddInternal(Arena* arena, absl::FunctionRef<ElementNewFn> factory);
// A few notes on internal representation:
//
@@ -797,8 +797,8 @@
inline void* RepeatedPtrFieldBase::AddInternal(
- absl::FunctionRef<ElementNewFn> factory) {
- Arena* const arena = GetArena();
+ Arena* arena, absl::FunctionRef<ElementNewFn> factory) {
+ ABSL_DCHECK_EQ(arena, GetArena());
if (tagged_rep_or_elem_ == nullptr) {
ExchangeCurrentSize(1);
factory(arena, tagged_rep_or_elem_);
@@ -1478,12 +1478,12 @@
template <typename Element>
PROTOBUF_NDEBUG_INLINE Element* RepeatedPtrField<Element>::Add()
ABSL_ATTRIBUTE_LIFETIME_BOUND {
- return RepeatedPtrFieldBase::Add<TypeHandler>();
+ return RepeatedPtrFieldBase::Add<TypeHandler>(GetArena());
}
template <typename Element>
PROTOBUF_NDEBUG_INLINE void RepeatedPtrField<Element>::Add(Element&& value) {
- RepeatedPtrFieldBase::Add<TypeHandler>(std::move(value));
+ RepeatedPtrFieldBase::Add<TypeHandler>(GetArena(), std::move(value));
}
template <typename Element>
@@ -1718,6 +1718,11 @@
return static_cast<size_t>(field.size());
}
+ static auto Add(RepeatedPtrFieldBase& field, const MessageLite* prototype) {
+ return field.AddFromPrototype<GenericTypeHandler<MessageLite>>(
+ field.GetArena(), prototype);
+ }
+
static void CopyFrom(const RepeatedPtrFieldBase& src,
RepeatedPtrFieldBase& dst) {
dst.Clear<GenericTypeHandler<google::protobuf::MessageLite>>();