hpb: Establish plumbing for returning a default msg for extensions

Not invoked just yet, as extant users may expect the old `GetOrPromote` pathway.

An incremental Δ for getting message extensions up to parity with proto2.

PiperOrigin-RevId: 695723050
pull/19079/head
Hong Shin 3 months ago committed by Copybara-Service
parent 723f095496
commit 9bd8e01c10
  1. 17
      csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs
  2. 51
      hpb/extension.h
  3. 6
      hpb_generator/gen_utils.cc

@ -1,17 +0,0 @@
#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#endregion
namespace Google.Protobuf.Reflection;
internal sealed partial class FeatureSetDescriptor
{
// Canonical serialized form of the edition defaults, generated by embed_edition_defaults.
private const string DefaultsBase64 =
"ChMYhAciACoMCAEQAhgCIAMoATACChMY5wciACoMCAIQARgBIAIoATABChMY6AciDAgBEAEYASACKAEwASoAIOYHKOgH";
}

@ -72,9 +72,8 @@ struct UpbExtensionTrait<int64_t> {
// not return an error if missing but the default msg
template <typename T>
struct UpbExtensionTrait<T> {
using DefaultType = int;
using ReturnType = int;
using DefaultFuncType = void (*)();
using DefaultType = std::false_type;
using ReturnType = Ptr<const T>;
};
// -------------------------------------------------------------------
@ -109,7 +108,11 @@ class ExtensionIdentifier {
const upb_MiniTableExtension* mini_table_ext_;
typename UpbExtensionTrait<ExtensionType>::ReturnType default_value() const {
return default_val_;
if constexpr (IsHpbClass<ExtensionType>) {
return ExtensionType::default_instance();
} else {
return default_val_;
}
}
typename UpbExtensionTrait<ExtensionType>::DefaultType default_val_;
@ -266,26 +269,10 @@ absl::Status SetExtension(
template <typename T, typename Extendee, typename Extension,
typename = hpb::internal::EnableIfHpbClassThatHasExtensions<T>>
absl::StatusOr<Ptr<const Extension>> GetExtension(
absl::StatusOr<typename internal::UpbExtensionTrait<Extension>::ReturnType>
GetExtension(
Ptr<T> message,
const ::hpb::internal::ExtensionIdentifier<Extendee, Extension>& id) {
upb_MessageValue value;
const bool ok = ::hpb::internal::GetOrPromoteExtension(
hpb::interop::upb::GetMessage(message), id.mini_table_ext(),
hpb::interop::upb::GetArena(message), &value);
if (!ok) {
return ExtensionNotFoundError(
upb_MiniTableExtension_Number(id.mini_table_ext()));
}
return Ptr<const Extension>(::hpb::interop::upb::MakeCHandle<Extension>(
(upb_Message*)value.msg_val, hpb::interop::upb::GetArena(message)));
}
template <typename T, typename Extendee, typename Extension,
typename = hpb::internal::EnableIfHpbClassThatHasExtensions<T>>
decltype(auto) GetExtension(
const T* message,
const hpb::internal::ExtensionIdentifier<Extendee, Extension>& id) {
if constexpr (std::is_integral_v<Extension>) {
auto default_val = hpb::internal::PrivateAccess::GetDefaultValue(id);
absl::StatusOr<Extension> res =
@ -294,10 +281,28 @@ decltype(auto) GetExtension(
default_val);
return res;
} else {
return GetExtension(Ptr(message), id);
upb_MessageValue value;
const bool ok = ::hpb::internal::GetOrPromoteExtension(
hpb::interop::upb::GetMessage(message), id.mini_table_ext(),
hpb::interop::upb::GetArena(message), &value);
if (!ok) {
return ExtensionNotFoundError(
upb_MiniTableExtension_Number(id.mini_table_ext()));
}
return Ptr<const Extension>(::hpb::interop::upb::MakeCHandle<Extension>(
(upb_Message*)value.msg_val, hpb::interop::upb::GetArena(message)));
}
}
template <typename T, typename Extendee, typename Extension,
typename = hpb::internal::EnableIfHpbClassThatHasExtensions<T>>
absl::StatusOr<typename internal::UpbExtensionTrait<Extension>::ReturnType>
GetExtension(
const T* message,
const hpb::internal::ExtensionIdentifier<Extendee, Extension>& id) {
return GetExtension(Ptr(message), id);
}
template <typename T, typename Extension>
constexpr uint32_t ExtensionNumber(
const internal::ExtensionIdentifier<T, Extension>& id) {

@ -136,12 +136,14 @@ std::string DefaultValue(const FieldDescriptor* field) {
return absl::StrCat(field->default_value_int32());
case FieldDescriptor::CPPTYPE_INT64:
return absl::StrCat(field->default_value_int64());
case FieldDescriptor::CPPTYPE_MESSAGE:
return "::std::false_type()";
default:
// TODO: b/375460289 - implement rest of scalars + msg
// TODO: b/375460289 - implement rest of scalars
ABSL_LOG(WARNING) << "Unsupported default value type (in-progress): <"
<< field->cpp_type_name()
<< "> For field: " << field->full_name();
return "-1";
return "::std::false_type()";
}
}

Loading…
Cancel
Save