Skip to content

Commit 00298fd

Browse files
Extension set uses (relatively) new RepeatedPtrField Message methods.
RepeatedPtrField had been updated to handle Add/MergeFrom when holding an abstract type MessageLite, hence ExtentionSet no longer needs to have custom workarounds. PiperOrigin-RevId: 602381489
1 parent 958fda3 commit 00298fd

File tree

1 file changed

+4
-35
lines changed

1 file changed

+4
-35
lines changed

src/google/protobuf/extension_set.cc

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -787,16 +787,9 @@ MessageLite* ExtensionSet::AddMessage(int number, FieldType type,
787787
ABSL_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE);
788788
}
789789

790-
// RepeatedPtrField<MessageLite> does not know how to Add() since it cannot
791-
// allocate an abstract object, so we have to be tricky.
792-
MessageLite* result = reinterpret_cast<internal::RepeatedPtrFieldBase*>(
793-
extension->repeated_message_value)
794-
->AddFromCleared<GenericTypeHandler<MessageLite>>();
795-
if (result == nullptr) {
796-
result = prototype.New(arena_);
797-
extension->repeated_message_value->AddAllocated(result);
798-
}
799-
return result;
790+
return reinterpret_cast<internal::RepeatedPtrFieldBase*>(
791+
extension->repeated_message_value)
792+
->AddMessage(&prototype);
800793
}
801794

802795
// Defined in extension_set_heavy.cc.
@@ -996,32 +989,8 @@ void ExtensionSet::InternalExtensionMergeFrom(const MessageLite* extendee,
996989
HANDLE_TYPE(BOOL, bool, RepeatedField<bool>);
997990
HANDLE_TYPE(ENUM, enum, RepeatedField<int>);
998991
HANDLE_TYPE(STRING, string, RepeatedPtrField<std::string>);
992+
HANDLE_TYPE(MESSAGE, message, RepeatedPtrField<MessageLite>);
999993
#undef HANDLE_TYPE
1000-
1001-
case WireFormatLite::CPPTYPE_MESSAGE: {
1002-
Arena* const arena = arena_;
1003-
if (is_new) {
1004-
extension->repeated_message_value =
1005-
Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena);
1006-
}
1007-
// We can't call RepeatedPtrField<MessageLite>::MergeFrom() because
1008-
// it would attempt to allocate new objects.
1009-
RepeatedPtrField<MessageLite>* other_repeated_message =
1010-
other_extension.repeated_message_value;
1011-
for (int i = 0; i < other_repeated_message->size(); i++) {
1012-
const MessageLite& other_message = other_repeated_message->Get(i);
1013-
MessageLite* target =
1014-
reinterpret_cast<internal::RepeatedPtrFieldBase*>(
1015-
extension->repeated_message_value)
1016-
->AddFromCleared<GenericTypeHandler<MessageLite>>();
1017-
if (target == nullptr) {
1018-
target = other_message.New(arena);
1019-
extension->repeated_message_value->AddAllocated(target);
1020-
}
1021-
target->CheckTypeAndMergeFrom(other_message);
1022-
}
1023-
break;
1024-
}
1025994
}
1026995
} else {
1027996
if (!other_extension.is_cleared) {

0 commit comments

Comments
 (0)