Skip to content

Commit

Permalink
Support arena allocation of google::protobuf::AnyMetadata
Browse files Browse the repository at this point in the history
  • Loading branch information
georgthegreat committed Jul 9, 2021
1 parent b24d0c2 commit d631469
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 21 deletions.
11 changes: 6 additions & 5 deletions src/google/protobuf/any.cc
Expand Up @@ -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 {
Expand Down
15 changes: 8 additions & 7 deletions src/google/protobuf/any.h
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions src/google/protobuf/any.pb.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions src/google/protobuf/any_lite.cc
Expand Up @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions src/google/protobuf/compiler/cpp/cpp_message.cc
Expand Up @@ -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"
Expand All @@ -1277,15 +1277,15 @@ 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&>"
"::value>::type>\n"
"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&>"
Expand Down

0 comments on commit d631469

Please sign in to comment.