diff --git a/src/google/protobuf/any.cc b/src/google/protobuf/any.cc index 029ba0d9299d..fea3269b01eb 100644 --- a/src/google/protobuf/any.cc +++ b/src/google/protobuf/any.cc @@ -50,9 +50,9 @@ bool AnyMetadata::PackFrom(const Message& message, type_url_->Set( &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyString(), GetTypeUrl(message.GetDescriptor()->full_name(), type_url_prefix), - nullptr); + GetArenaForAllocation()); return message.SerializeToString( - value_->Mutable(ArenaStringPtr::EmptyDefault{}, nullptr)); + value_->Mutable(ArenaStringPtr::EmptyDefault{}, GetArenaForAllocation())); } bool AnyMetadata::UnpackTo(Message* message) const { diff --git a/src/google/protobuf/any.h b/src/google/protobuf/any.h index 684fbf158431..a9052550d518 100644 --- a/src/google/protobuf/any.h +++ b/src/google/protobuf/any.h @@ -61,8 +61,12 @@ class PROTOBUF_EXPORT AnyMetadata { public: // AnyMetadata does not take ownership of "type_url" and "value". constexpr AnyMetadata(UrlType* type_url, ValueType* value) - : type_url_(type_url), value_(value) {} + : AnyMetadata(nullptr, type_url, value) {} + constexpr AnyMetadata(Arena* arena, UrlType* type_url, ValueType* value) + : arena_(arena) + , type_url_(type_url) + , value_(value) {} // Packs a message using the default type URL prefix: "type.googleapis.com". // The resulted type URL will be "type.googleapis.com/". // Returns false if serializing the message failed. @@ -108,6 +112,7 @@ class PROTOBUF_EXPORT AnyMetadata { } private: + Arena* GetArenaForAllocation() const { return arena_; } bool InternalPackFrom(const MessageLite& message, StringPiece type_url_prefix, StringPiece type_name); @@ -115,6 +120,7 @@ class PROTOBUF_EXPORT AnyMetadata { MessageLite* message) const; bool InternalIs(StringPiece type_name) const; + Arena* arena_; UrlType* type_url_; ValueType* value_; diff --git a/src/google/protobuf/any.pb.cc b/src/google/protobuf/any.pb.cc index c6dff7b1f3fd..91ed68db91a6 100644 --- a/src/google/protobuf/any.pb.cc +++ b/src/google/protobuf/any.pb.cc @@ -99,7 +99,7 @@ class Any::_Internal { Any::Any(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned) : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned), - _any_metadata_(&type_url_, &value_) { + _any_metadata_(arena, &type_url_, &value_) { SharedCtor(); if (!is_message_owned) { RegisterArenaDtor(arena); diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc index be6f34810840..e70fe62efcbc 100644 --- a/src/google/protobuf/compiler/cpp/cpp_message.cc +++ b/src/google/protobuf/compiler/cpp/cpp_message.cc @@ -2603,7 +2603,7 @@ void MessageGenerator::GenerateStructors(io::Printer* printer) { } if (IsAnyMessage(descriptor_, options_)) { - initializer_with_arena += ",\n _any_metadata_(&type_url_, &value_)"; + initializer_with_arena += ",\n _any_metadata_(arena, &type_url_, &value_)"; } if (num_weak_fields_ > 0) { initializer_with_arena += ", _weak_field_map_(arena)";