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>>();