Support arena allocation of google::protobuf::AnyMetadata (#8758)

pull/8811/head
Yuriy Chernyshov 4 years ago committed by GitHub
parent 4b3da9f618
commit 7b1f7938bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      src/google/protobuf/any.cc
  2. 15
      src/google/protobuf/any.h
  3. 4
      src/google/protobuf/any.pb.h
  4. 7
      src/google/protobuf/any_lite.cc
  5. 8
      src/google/protobuf/compiler/cpp/cpp_message.cc

@ -41,18 +41,19 @@ namespace google {
namespace protobuf {
namespace internal {
bool AnyMetadata::PackFrom(const Message& message) {
return PackFrom(message, kTypeGoogleApisComPrefix);
bool AnyMetadata::PackFrom(Arena* arena, const Message& message) {
return PackFrom(arena, message, kTypeGoogleApisComPrefix);
}
bool AnyMetadata::PackFrom(const Message& message,
bool AnyMetadata::PackFrom(Arena* arena,
const Message& message,
StringPiece type_url_prefix) {
type_url_->Set(
&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyString(),
GetTypeUrl(message.GetDescriptor()->full_name(), type_url_prefix),
nullptr);
arena);
return message.SerializeToString(
value_->Mutable(ArenaStringPtr::EmptyDefault{}, nullptr));
value_->Mutable(ArenaStringPtr::EmptyDefault{}, arena));
}
bool AnyMetadata::UnpackTo(Message* message) const {

@ -67,12 +67,12 @@ class PROTOBUF_EXPORT AnyMetadata {
// The resulted type URL will be "type.googleapis.com/<message_full_name>".
// Returns false if serializing the message failed.
template <typename T>
bool PackFrom(const T& message) {
return InternalPackFrom(message, kTypeGoogleApisComPrefix,
bool PackFrom(Arena* arena, const T& message) {
return InternalPackFrom(arena, message, kTypeGoogleApisComPrefix,
T::FullMessageName());
}
bool PackFrom(const Message& message);
bool PackFrom(Arena* arena, const Message& message);
// Packs a message using the given type URL prefix. The type URL will be
// constructed by concatenating the message type's full name to the prefix
@ -82,11 +82,11 @@ class PROTOBUF_EXPORT AnyMetadata {
// URL: "type.googleapis.com/<message_full_name>".
// Returns false if serializing the message failed.
template <typename T>
bool PackFrom(const T& message, StringPiece type_url_prefix) {
return InternalPackFrom(message, type_url_prefix, T::FullMessageName());
bool PackFrom(Arena* arena, const T& message, StringPiece type_url_prefix) {
return InternalPackFrom(arena, message, type_url_prefix, T::FullMessageName());
}
bool PackFrom(const Message& message, StringPiece type_url_prefix);
bool PackFrom(Arena* arena, const Message& message, StringPiece type_url_prefix);
// Unpacks the payload into the given message. Returns false if the message's
// type doesn't match the type specified in the type URL (i.e., the full
@ -108,7 +108,8 @@ class PROTOBUF_EXPORT AnyMetadata {
}
private:
bool InternalPackFrom(const MessageLite& message,
bool InternalPackFrom(Arena* arena,
const MessageLite& message,
StringPiece type_url_prefix,
StringPiece type_name);
bool InternalUnpackTo(StringPiece type_name,

@ -114,11 +114,11 @@ class PROTOBUF_EXPORT Any final :
// implements Any -----------------------------------------------
bool PackFrom(const ::PROTOBUF_NAMESPACE_ID::Message& message) {
return _any_metadata_.PackFrom(message);
return _any_metadata_.PackFrom(GetArena(), message);
}
bool PackFrom(const ::PROTOBUF_NAMESPACE_ID::Message& message,
::PROTOBUF_NAMESPACE_ID::ConstStringParam type_url_prefix) {
return _any_metadata_.PackFrom(message, type_url_prefix);
return _any_metadata_.PackFrom(GetArena(), message, type_url_prefix);
}
bool UnpackTo(::PROTOBUF_NAMESPACE_ID::Message* message) const {
return _any_metadata_.UnpackTo(message);

@ -53,13 +53,14 @@ const char kAnyFullTypeName[] = "google.protobuf.Any";
const char kTypeGoogleApisComPrefix[] = "type.googleapis.com/";
const char kTypeGoogleProdComPrefix[] = "type.googleprod.com/";
bool AnyMetadata::InternalPackFrom(const MessageLite& message,
bool AnyMetadata::InternalPackFrom(Arena* arena,
const MessageLite& message,
StringPiece type_url_prefix,
StringPiece type_name) {
type_url_->Set(&::google::protobuf::internal::GetEmptyString(),
GetTypeUrl(type_name, type_url_prefix), nullptr);
GetTypeUrl(type_name, type_url_prefix), arena);
return message.SerializeToString(
value_->Mutable(ArenaStringPtr::EmptyDefault{}, nullptr));
value_->Mutable(ArenaStringPtr::EmptyDefault{}, arena));
}
bool AnyMetadata::InternalUnpackTo(StringPiece type_name,

@ -1259,12 +1259,12 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) {
if (HasDescriptorMethods(descriptor_->file(), options_)) {
format(
"bool PackFrom(const ::$proto_ns$::Message& message) {\n"
" return _any_metadata_.PackFrom(message);\n"
" return _any_metadata_.PackFrom(GetArena(), message);\n"
"}\n"
"bool PackFrom(const ::$proto_ns$::Message& message,\n"
" ::PROTOBUF_NAMESPACE_ID::ConstStringParam "
"type_url_prefix) {\n"
" return _any_metadata_.PackFrom(message, type_url_prefix);\n"
" return _any_metadata_.PackFrom(GetArena(), message, type_url_prefix);\n"
"}\n"
"bool UnpackTo(::$proto_ns$::Message* message) const {\n"
" return _any_metadata_.UnpackTo(message);\n"
@ -1277,7 +1277,7 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) {
"!std::is_convertible<T, const ::$proto_ns$::Message&>"
"::value>::type>\n"
"bool PackFrom(const T& message) {\n"
" return _any_metadata_.PackFrom<T>(message);\n"
" return _any_metadata_.PackFrom<T>(GetArena(), message);\n"
"}\n"
"template <typename T, class = typename std::enable_if<"
"!std::is_convertible<T, const ::$proto_ns$::Message&>"
@ -1285,7 +1285,7 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* printer) {
"bool PackFrom(const T& message,\n"
" ::PROTOBUF_NAMESPACE_ID::ConstStringParam "
"type_url_prefix) {\n"
" return _any_metadata_.PackFrom<T>(message, type_url_prefix);"
" return _any_metadata_.PackFrom<T>(GetArena(), message, type_url_prefix);"
"}\n"
"template <typename T, class = typename std::enable_if<"
"!std::is_convertible<T, const ::$proto_ns$::Message&>"

Loading…
Cancel
Save