Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 1 commit into from Jul 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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