diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc index 5328fa071a..e1034ca094 100644 --- a/src/google/protobuf/extension_set.cc +++ b/src/google/protobuf/extension_set.cc @@ -787,16 +787,9 @@ MessageLite* ExtensionSet::AddMessage(int number, FieldType type, ABSL_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE); } - // RepeatedPtrField does not know how to Add() since it cannot - // allocate an abstract object, so we have to be tricky. - MessageLite* result = reinterpret_cast( - extension->repeated_message_value) - ->AddFromCleared>(); - if (result == nullptr) { - result = prototype.New(arena_); - extension->repeated_message_value->AddAllocated(result); - } - return result; + return reinterpret_cast( + extension->repeated_message_value) + ->AddMessage(&prototype); } // Defined in extension_set_heavy.cc. @@ -996,32 +989,8 @@ void ExtensionSet::InternalExtensionMergeFrom(const MessageLite* extendee, HANDLE_TYPE(BOOL, bool, RepeatedField); HANDLE_TYPE(ENUM, enum, RepeatedField); HANDLE_TYPE(STRING, string, RepeatedPtrField); + HANDLE_TYPE(MESSAGE, message, RepeatedPtrField); #undef HANDLE_TYPE - - case WireFormatLite::CPPTYPE_MESSAGE: { - Arena* const arena = arena_; - if (is_new) { - extension->repeated_message_value = - Arena::CreateMessage>(arena); - } - // We can't call RepeatedPtrField::MergeFrom() because - // it would attempt to allocate new objects. - RepeatedPtrField* other_repeated_message = - other_extension.repeated_message_value; - for (int i = 0; i < other_repeated_message->size(); i++) { - const MessageLite& other_message = other_repeated_message->Get(i); - MessageLite* target = - reinterpret_cast( - extension->repeated_message_value) - ->AddFromCleared>(); - if (target == nullptr) { - target = other_message.New(arena); - extension->repeated_message_value->AddAllocated(target); - } - target->CheckTypeAndMergeFrom(other_message); - } - break; - } } } else { if (!other_extension.is_cleared) {