diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc index 0a35eb307b..d076a101f0 100644 --- a/src/google/protobuf/generated_message_reflection.cc +++ b/src/google/protobuf/generated_message_reflection.cc @@ -1974,11 +1974,9 @@ absl::Cord Reflection::GetCord(const Message& message, } } -absl::string_view Reflection::GetStringView(const Message& message, - const FieldDescriptor* field, - ScratchSpace& scratch) const { - USAGE_CHECK_ALL(GetStringView, SINGULAR, STRING); - +absl::string_view Reflection::GetStringViewImpl(const Message& message, + const FieldDescriptor* field, + ScratchSpace* scratch) const { if (field->is_extension()) { return GetExtensionSet(message).GetString( field->number(), internal::DefaultValueStringAsString(field)); @@ -1992,7 +1990,8 @@ absl::string_view Reflection::GetStringView(const Message& message, const auto& cord = schema_.InRealOneof(field) ? *GetField(message, field) : GetField(message, field); - return scratch.CopyFromCord(cord); + ABSL_DCHECK(scratch); + return scratch->CopyFromCord(cord); } default: auto str = GetField(message, field); @@ -2000,6 +1999,13 @@ absl::string_view Reflection::GetStringView(const Message& message, } } +absl::string_view Reflection::GetStringView(const Message& message, + const FieldDescriptor* field, + ScratchSpace& scratch) const { + USAGE_CHECK_ALL(GetStringView, SINGULAR, STRING); + return GetStringViewImpl(message, field, &scratch); +} + void Reflection::SetString(Message* message, const FieldDescriptor* field, std::string value) const { diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h index 8ea7004663..3a2b9298f7 100644 --- a/src/google/protobuf/message.h +++ b/src/google/protobuf/message.h @@ -987,6 +987,11 @@ class PROTOBUF_EXPORT Reflection final { RepeatedPtrField* MutableRepeatedPtrFieldInternal( Message* message, const FieldDescriptor* field) const; + // REQUIRES: If the field is Cord, then `scratch != nullptr`. + absl::string_view GetStringViewImpl(const Message& message, + const FieldDescriptor* field, + ScratchSpace* scratch) const; + // Obtain a pointer to a Repeated Field Structure and do some type checking: // on field->cpp_type(), // on field->field_option().ctype() (if ctype >= 0)