Skip to content

Commit

Permalink
Spupport arena allocation of google::protobuf::AnyMetadata
Browse files Browse the repository at this point in the history
  • Loading branch information
georgthegreat committed Jun 23, 2021
1 parent b24d0c2 commit 3ab3c6a
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/google/protobuf/any.cc
Expand Up @@ -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 {
Expand Down
8 changes: 7 additions & 1 deletion src/google/protobuf/any.h
Expand Up @@ -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/<message_full_name>".
// Returns false if serializing the message failed.
Expand Down Expand Up @@ -108,13 +112,15 @@ class PROTOBUF_EXPORT AnyMetadata {
}

private:
Arena* GetArenaForAllocation() const { return arena_; }
bool InternalPackFrom(const MessageLite& message,
StringPiece type_url_prefix,
StringPiece type_name);
bool InternalUnpackTo(StringPiece type_name,
MessageLite* message) const;
bool InternalIs(StringPiece type_name) const;

Arena* arena_;
UrlType* type_url_;
ValueType* value_;

Expand Down
2 changes: 1 addition & 1 deletion src/google/protobuf/any.pb.cc

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

2 changes: 1 addition & 1 deletion src/google/protobuf/compiler/cpp/cpp_message.cc
Expand Up @@ -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)";
Expand Down

0 comments on commit 3ab3c6a

Please sign in to comment.