Miscelaneous refactoring to prepare the code for the custom vtables changes.

This change has no effect in behavior, but makes future changes smaller.

 - Make `Message` and `MessageLite` constructors protected.
 - Make ClassData objects namespace scope globals instead of function scope. This will allow taking their address without calling a function.
 - Replace direct calls to `~MessageLite()` with a helper function.

PiperOrigin-RevId: 638676816
pull/16981/head
Protobuf Team Bot 9 months ago committed by Copybara-Service
parent 092cc15f9d
commit 9e83842ce0
  1. 78
      src/google/protobuf/compiler/cpp/message.cc
  2. 39
      src/google/protobuf/compiler/java/java_features.pb.cc
  3. 1
      src/google/protobuf/compiler/java/java_features.pb.h
  4. 156
      src/google/protobuf/compiler/plugin.pb.cc
  5. 4
      src/google/protobuf/compiler/plugin.pb.h
  6. 39
      src/google/protobuf/cpp_features.pb.cc
  7. 1
      src/google/protobuf/cpp_features.pb.h
  8. 1287
      src/google/protobuf/descriptor.pb.cc
  9. 33
      src/google/protobuf/descriptor.pb.h
  10. 5
      src/google/protobuf/generated_message_bases.h
  11. 2
      src/google/protobuf/generated_message_tctable_lite.cc
  12. 3
      src/google/protobuf/generated_message_util.cc
  13. 45
      src/google/protobuf/implicit_weak_message.cc
  14. 12
      src/google/protobuf/implicit_weak_message.h
  15. 4
      src/google/protobuf/map.cc
  16. 3
      src/google/protobuf/map_test.inc
  17. 5
      src/google/protobuf/message.h
  18. 5
      src/google/protobuf/message_lite.cc
  19. 12
      src/google/protobuf/message_lite.h

@ -1288,6 +1288,7 @@ void MessageGenerator::GenerateMapEntryClassDefinition(io::Printer* p) {
)cc");
p->Emit(R"cc(
const $superclass$::ClassData* GetClassData() const final;
static const $superclass$::ClassDataFull _class_data_;
)cc");
format(
" friend struct ::$tablename$;\n"
@ -1904,6 +1905,11 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* p) {
)cc");
}},
{"decl_impl", [&] { GenerateImplDefinition(p); }},
{"classdata_type",
HasDescriptorMethods(descriptor_->file(), options_)
? "ClassDataFull"
: absl::StrFormat("ClassDataLite<%d>",
descriptor_->full_name().size() + 1)},
{"split_friend",
[&] {
if (!ShouldSplit(descriptor_, options_)) return;
@ -2019,6 +2025,7 @@ void MessageGenerator::GenerateClassDefinition(io::Printer* p) {
}
$arena_dtor$;
const $superclass$::ClassData* GetClassData() const final;
static const $superclass$::$classdata_type$ _class_data_;
public:
$get_metadata$;
@ -3690,26 +3697,27 @@ void MessageGenerator::GenerateClassData(io::Printer* p) {
}},
},
R"cc(
const ::$proto_ns$::MessageLite::ClassData*
$classname$::GetClassData() const {
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::$proto_ns$::MessageLite::ClassDataFull
$classname$::_class_data_ = {
$superclass$::ClassData{
$table$,
$on_demand_register_arena_dtor$,
$is_initialized$,
&$classname$::MergeImpl,
PROTOBUF_FIELD_OFFSET($classname$, $cached_size$),
false,
},
&$classname$::kDescriptorMethods,
&$desc_table$,
$tracker_on_get_metadata$,
};
const ::$proto_ns$::MessageLite::ClassData* $classname$::GetClassData() const {
$pin_weak_descriptor$;
PROTOBUF_CONSTINIT static const ::$proto_ns$::MessageLite::
ClassDataFull _data_ = {
{
$table$,
$on_demand_register_arena_dtor$,
$is_initialized$,
&$classname$::MergeImpl,
PROTOBUF_FIELD_OFFSET($classname$, $cached_size$),
false,
},
&$classname$::kDescriptorMethods,
&$desc_table$,
$tracker_on_get_metadata$,
};
$pbi$::PrefetchToLocalCache(&_data_);
$pbi$::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
$pbi$::PrefetchToLocalCache(&_class_data_);
$pbi$::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
)cc");
} else {
@ -3720,22 +3728,22 @@ void MessageGenerator::GenerateClassData(io::Printer* p) {
{"is_initialized", is_initialized},
},
R"cc(
const ::$proto_ns$::MessageLite::ClassData*
$classname$::GetClassData() const {
PROTOBUF_CONSTINIT static const ClassDataLite<$type_size$> _data_ =
{
{
&_table_.header,
$on_demand_register_arena_dtor$,
$is_initialized$,
&$classname$::MergeImpl,
PROTOBUF_FIELD_OFFSET($classname$, $cached_size$),
true,
},
"$full_name$",
};
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::$proto_ns$::MessageLite::ClassDataLite<$type_size$>
$classname$::_class_data_ = {
{
&_table_.header,
$on_demand_register_arena_dtor$,
$is_initialized$,
&$classname$::MergeImpl,
PROTOBUF_FIELD_OFFSET($classname$, $cached_size$),
true,
},
"$full_name$",
};
const ::$proto_ns$::MessageLite::ClassData* $classname$::GetClassData() const {
return _class_data_.base();
}
)cc");
}

@ -183,25 +183,26 @@ inline void JavaFeatures::SharedDtor() {
_impl_.~Impl_();
}
const ::google::protobuf::MessageLite::ClassData*
JavaFeatures::GetClassData() const {
PROTOBUF_CONSTINIT static const ::google::protobuf::MessageLite::
ClassDataFull _data_ = {
{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&JavaFeatures::MergeImpl,
PROTOBUF_FIELD_OFFSET(JavaFeatures, _impl_._cached_size_),
false,
},
&JavaFeatures::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fjava_2fjava_5ffeatures_2eproto,
nullptr, // tracker
};
::google::protobuf::internal::PrefetchToLocalCache(&_data_);
::google::protobuf::internal::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
JavaFeatures::_class_data_ = {
::google::protobuf::Message::ClassData{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&JavaFeatures::MergeImpl,
PROTOBUF_FIELD_OFFSET(JavaFeatures, _impl_._cached_size_),
false,
},
&JavaFeatures::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fjava_2fjava_5ffeatures_2eproto,
nullptr, // tracker
};
const ::google::protobuf::MessageLite::ClassData* JavaFeatures::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<1, 2, 1, 0, 2> JavaFeatures::_table_ = {

@ -215,6 +215,7 @@ class PROTOC_EXPORT JavaFeatures final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;

@ -359,25 +359,26 @@ inline void Version::SharedDtor() {
_impl_.~Impl_();
}
const ::google::protobuf::MessageLite::ClassData*
Version::GetClassData() const {
PROTOBUF_CONSTINIT static const ::google::protobuf::MessageLite::
ClassDataFull _data_ = {
{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&Version::MergeImpl,
PROTOBUF_FIELD_OFFSET(Version, _impl_._cached_size_),
false,
},
&Version::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
::google::protobuf::internal::PrefetchToLocalCache(&_data_);
::google::protobuf::internal::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
Version::_class_data_ = {
::google::protobuf::Message::ClassData{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&Version::MergeImpl,
PROTOBUF_FIELD_OFFSET(Version, _impl_._cached_size_),
false,
},
&Version::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
const ::google::protobuf::MessageLite::ClassData* Version::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<2, 4, 0, 47, 2> Version::_table_ = {
@ -663,25 +664,26 @@ inline void CodeGeneratorRequest::SharedDtor() {
_impl_.~Impl_();
}
const ::google::protobuf::MessageLite::ClassData*
CodeGeneratorRequest::GetClassData() const {
PROTOBUF_CONSTINIT static const ::google::protobuf::MessageLite::
ClassDataFull _data_ = {
{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
CodeGeneratorRequest::IsInitializedImpl,
&CodeGeneratorRequest::MergeImpl,
PROTOBUF_FIELD_OFFSET(CodeGeneratorRequest, _impl_._cached_size_),
false,
},
&CodeGeneratorRequest::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
::google::protobuf::internal::PrefetchToLocalCache(&_data_);
::google::protobuf::internal::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
CodeGeneratorRequest::_class_data_ = {
::google::protobuf::Message::ClassData{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
CodeGeneratorRequest::IsInitializedImpl,
&CodeGeneratorRequest::MergeImpl,
PROTOBUF_FIELD_OFFSET(CodeGeneratorRequest, _impl_._cached_size_),
false,
},
&CodeGeneratorRequest::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
const ::google::protobuf::MessageLite::ClassData* CodeGeneratorRequest::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<3, 5, 3, 79, 2> CodeGeneratorRequest::_table_ = {
@ -1020,25 +1022,26 @@ inline void CodeGeneratorResponse_File::SharedDtor() {
_impl_.~Impl_();
}
const ::google::protobuf::MessageLite::ClassData*
CodeGeneratorResponse_File::GetClassData() const {
PROTOBUF_CONSTINIT static const ::google::protobuf::MessageLite::
ClassDataFull _data_ = {
{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&CodeGeneratorResponse_File::MergeImpl,
PROTOBUF_FIELD_OFFSET(CodeGeneratorResponse_File, _impl_._cached_size_),
false,
},
&CodeGeneratorResponse_File::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
::google::protobuf::internal::PrefetchToLocalCache(&_data_);
::google::protobuf::internal::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
CodeGeneratorResponse_File::_class_data_ = {
::google::protobuf::Message::ClassData{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&CodeGeneratorResponse_File::MergeImpl,
PROTOBUF_FIELD_OFFSET(CodeGeneratorResponse_File, _impl_._cached_size_),
false,
},
&CodeGeneratorResponse_File::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
const ::google::protobuf::MessageLite::ClassData* CodeGeneratorResponse_File::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<2, 4, 1, 86, 2> CodeGeneratorResponse_File::_table_ = {
@ -1333,25 +1336,26 @@ inline void CodeGeneratorResponse::SharedDtor() {
_impl_.~Impl_();
}
const ::google::protobuf::MessageLite::ClassData*
CodeGeneratorResponse::GetClassData() const {
PROTOBUF_CONSTINIT static const ::google::protobuf::MessageLite::
ClassDataFull _data_ = {
{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&CodeGeneratorResponse::MergeImpl,
PROTOBUF_FIELD_OFFSET(CodeGeneratorResponse, _impl_._cached_size_),
false,
},
&CodeGeneratorResponse::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
::google::protobuf::internal::PrefetchToLocalCache(&_data_);
::google::protobuf::internal::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
CodeGeneratorResponse::_class_data_ = {
::google::protobuf::Message::ClassData{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&CodeGeneratorResponse::MergeImpl,
PROTOBUF_FIELD_OFFSET(CodeGeneratorResponse, _impl_._cached_size_),
false,
},
&CodeGeneratorResponse::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
nullptr, // tracker
};
const ::google::protobuf::MessageLite::ClassData* CodeGeneratorResponse::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<3, 5, 1, 60, 2> CodeGeneratorResponse::_table_ = {

@ -232,6 +232,7 @@ class PROTOC_EXPORT Version final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -450,6 +451,7 @@ class PROTOC_EXPORT CodeGeneratorResponse_File final : public ::google::protobuf
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -684,6 +686,7 @@ class PROTOC_EXPORT CodeGeneratorResponse final : public ::google::protobuf::Mes
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -947,6 +950,7 @@ class PROTOC_EXPORT CodeGeneratorRequest final : public ::google::protobuf::Mess
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;

@ -178,25 +178,26 @@ inline void CppFeatures::SharedDtor() {
_impl_.~Impl_();
}
const ::google::protobuf::MessageLite::ClassData*
CppFeatures::GetClassData() const {
PROTOBUF_CONSTINIT static const ::google::protobuf::MessageLite::
ClassDataFull _data_ = {
{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&CppFeatures::MergeImpl,
PROTOBUF_FIELD_OFFSET(CppFeatures, _impl_._cached_size_),
false,
},
&CppFeatures::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcpp_5ffeatures_2eproto,
nullptr, // tracker
};
::google::protobuf::internal::PrefetchToLocalCache(&_data_);
::google::protobuf::internal::PrefetchToLocalCache(_data_.tc_table);
return _data_.base();
PROTOBUF_CONSTINIT
PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::google::protobuf::MessageLite::ClassDataFull
CppFeatures::_class_data_ = {
::google::protobuf::Message::ClassData{
&_table_.header,
nullptr, // OnDemandRegisterArenaDtor
nullptr, // IsInitialized
&CppFeatures::MergeImpl,
PROTOBUF_FIELD_OFFSET(CppFeatures, _impl_._cached_size_),
false,
},
&CppFeatures::kDescriptorMethods,
&descriptor_table_google_2fprotobuf_2fcpp_5ffeatures_2eproto,
nullptr, // tracker
};
const ::google::protobuf::MessageLite::ClassData* CppFeatures::GetClassData() const {
::google::protobuf::internal::PrefetchToLocalCache(&_class_data_);
::google::protobuf::internal::PrefetchToLocalCache(_class_data_.tc_table);
return _class_data_.base();
}
PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
const ::_pbi::TcParseTable<1, 2, 1, 0, 2> CppFeatures::_table_ = {

@ -216,6 +216,7 @@ class PROTOBUF_EXPORT CppFeatures final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;

File diff suppressed because it is too large Load Diff

@ -823,6 +823,7 @@ class PROTOBUF_EXPORT UninterpretedOption_NamePart final : public ::google::prot
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -1015,6 +1016,7 @@ class PROTOBUF_EXPORT SourceCodeInfo_Location final : public ::google::protobuf:
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -1285,6 +1287,7 @@ class PROTOBUF_EXPORT GeneratedCodeInfo_Annotation final : public ::google::prot
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -1544,6 +1547,7 @@ class PROTOBUF_EXPORT FieldOptions_FeatureSupport final : public ::google::proto
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -1762,6 +1766,7 @@ class PROTOBUF_EXPORT FieldOptions_EditionDefault final : public ::google::proto
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -1959,6 +1964,7 @@ class PROTOBUF_EXPORT FeatureSet final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -2498,6 +2504,7 @@ class PROTOBUF_EXPORT ExtensionRangeOptions_Declaration final : public ::google:
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -2735,6 +2742,7 @@ class PROTOBUF_EXPORT EnumDescriptorProto_EnumReservedRange final : public ::goo
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -2921,6 +2929,7 @@ class PROTOBUF_EXPORT DescriptorProto_ReservedRange final : public ::google::pro
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -3112,6 +3121,7 @@ class PROTOBUF_EXPORT UninterpretedOption final : public ::google::protobuf::Mes
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -3388,6 +3398,7 @@ class PROTOBUF_EXPORT SourceCodeInfo final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -3567,6 +3578,7 @@ class PROTOBUF_EXPORT GeneratedCodeInfo final : public ::google::protobuf::Messa
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -3751,6 +3763,7 @@ class PROTOBUF_EXPORT FeatureSetDefaults_FeatureSetEditionDefault final : public
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -3963,6 +3976,7 @@ class PROTOBUF_EXPORT ServiceOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -4357,6 +4371,7 @@ class PROTOBUF_EXPORT OneofOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -4738,6 +4753,7 @@ class PROTOBUF_EXPORT MethodOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -5165,6 +5181,7 @@ class PROTOBUF_EXPORT MessageOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -5611,6 +5628,7 @@ class PROTOBUF_EXPORT FileOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -6319,6 +6337,7 @@ class PROTOBUF_EXPORT FieldOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -6963,6 +6982,7 @@ class PROTOBUF_EXPORT FeatureSetDefaults final : public ::google::protobuf::Mess
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -7174,6 +7194,7 @@ class PROTOBUF_EXPORT ExtensionRangeOptions final : public ::google::protobuf::M
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -7607,6 +7628,7 @@ class PROTOBUF_EXPORT EnumValueOptions final : public ::google::protobuf::Messag
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -8031,6 +8053,7 @@ class PROTOBUF_EXPORT EnumOptions final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -8451,6 +8474,7 @@ class PROTOBUF_EXPORT OneofDescriptorProto final : public ::google::protobuf::Me
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -8652,6 +8676,7 @@ class PROTOBUF_EXPORT MethodDescriptorProto final : public ::google::protobuf::M
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -8917,6 +8942,7 @@ class PROTOBUF_EXPORT FieldDescriptorProto final : public ::google::protobuf::Me
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -9314,6 +9340,7 @@ class PROTOBUF_EXPORT EnumValueDescriptorProto final : public ::google::protobuf
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -9528,6 +9555,7 @@ class PROTOBUF_EXPORT DescriptorProto_ExtensionRange final : public ::google::pr
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -9736,6 +9764,7 @@ class PROTOBUF_EXPORT ServiceDescriptorProto final : public ::google::protobuf::
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -9956,6 +9985,7 @@ class PROTOBUF_EXPORT EnumDescriptorProto final : public ::google::protobuf::Mes
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -10226,6 +10256,7 @@ class PROTOBUF_EXPORT DescriptorProto final : public ::google::protobuf::Message
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -10592,6 +10623,7 @@ class PROTOBUF_EXPORT FileDescriptorProto final : public ::google::protobuf::Mes
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;
@ -11007,6 +11039,7 @@ class PROTOBUF_EXPORT FileDescriptorSet final : public ::google::protobuf::Messa
*this = ::std::move(from);
}
const ::google::protobuf::Message::ClassData* GetClassData() const final;
static const ::google::protobuf::Message::ClassDataFull _class_data_;
public:
::google::protobuf::Metadata GetMetadata() const;

@ -37,9 +37,8 @@ class PROTOBUF_EXPORT ZeroFieldsBase : public Message {
protected:
constexpr ZeroFieldsBase() {}
explicit ZeroFieldsBase(Arena* arena) : Message(arena) {}
ZeroFieldsBase(const ZeroFieldsBase&) = delete;
ZeroFieldsBase& operator=(const ZeroFieldsBase&) = delete;
using Message::Message;
~ZeroFieldsBase() override;
static void MergeImpl(MessageLite& to, const MessageLite& from);

@ -2562,7 +2562,7 @@ PROTOBUF_NOINLINE void TcParser::DestroyMapNode(NodeBase* node,
->~basic_string();
} else if (map_info.value_type_card.cpp_type() == MapTypeCard::kMessage) {
static_cast<MessageLite*>(node->GetVoidValue(map_info.node_size_info))
->~MessageLite();
->DestroyInstance(false);
}
map.DeallocNode(node, map_info.node_size_info);
}

@ -35,9 +35,6 @@ namespace google {
namespace protobuf {
namespace internal {
void DestroyMessage(const void* message) {
static_cast<const MessageLite*>(message)->~MessageLite();
}
void DestroyString(const void* s) {
static_cast<const std::string*>(s)->~basic_string();
}

@ -7,8 +7,6 @@
#include "google/protobuf/implicit_weak_message.h"
#include <string>
#include "google/protobuf/generated_message_tctable_decl.h"
#include "google/protobuf/message_lite.h"
#include "google/protobuf/parse_context.h"
@ -45,33 +43,34 @@ struct ImplicitWeakMessageDefaultType {
};
};
constexpr ImplicitWeakMessage::ImplicitWeakMessage(ConstantInitialized)
: data_(nullptr) {}
PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT ImplicitWeakMessageDefaultType
implicit_weak_message_default_instance;
const ImplicitWeakMessage* ImplicitWeakMessage::default_instance() {
return reinterpret_cast<ImplicitWeakMessage*>(
&implicit_weak_message_default_instance);
const ImplicitWeakMessage& ImplicitWeakMessage::default_instance() {
return implicit_weak_message_default_instance.instance;
}
static const auto table =
internal::CreateStubTcParseTable<ImplicitWeakMessage,
ImplicitWeakMessage::ParseImpl>(
&implicit_weak_message_default_instance.instance);
constexpr MessageLite::ClassDataLite<1> ImplicitWeakMessage::class_data_ = {
{
&table.header,
nullptr, // on_demand_register_arena_dtor
nullptr, // is_initialized (always true)
MergeImpl,
PROTOBUF_FIELD_OFFSET(ImplicitWeakMessage, cached_size_),
true,
},
""};
const MessageLite::ClassData* ImplicitWeakMessage::GetClassData() const {
struct Data {
ClassData header;
char name[1];
};
static const auto table =
internal::CreateStubTcParseTable<ImplicitWeakMessage, ParseImpl>(
&implicit_weak_message_default_instance.instance);
static constexpr Data data = {
{
&table.header,
nullptr, // on_demand_register_arena_dtor
nullptr, // is_initialized (always true)
MergeImpl,
PROTOBUF_FIELD_OFFSET(ImplicitWeakMessage, cached_size_),
true,
},
""};
return &data.header;
return class_data_.base();
}
} // namespace internal

@ -32,11 +32,10 @@ namespace internal {
// An implementation of MessageLite that treats all data as unknown. This type
// acts as a placeholder for an implicit weak field in the case where the true
// message type does not get linked into the binary.
class PROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite {
class PROTOBUF_EXPORT ImplicitWeakMessage final : public MessageLite {
public:
ImplicitWeakMessage() : ImplicitWeakMessage(nullptr) {}
explicit constexpr ImplicitWeakMessage(ConstantInitialized)
: data_(nullptr) {}
explicit constexpr ImplicitWeakMessage(ConstantInitialized);
ImplicitWeakMessage(const ImplicitWeakMessage&) = delete;
ImplicitWeakMessage& operator=(const ImplicitWeakMessage&) = delete;
@ -54,7 +53,7 @@ class PROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite {
delete data_;
}
static const ImplicitWeakMessage* default_instance();
static const ImplicitWeakMessage& default_instance();
const ClassData* GetClassData() const final;
@ -81,9 +80,12 @@ class PROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite {
typedef void InternalArenaConstructable_;
private:
static const char* ParseImpl(ImplicitWeakMessage* msg, const char* ptr,
ParseContext* ctx);
private:
static const ClassDataLite<1> class_data_;
static void MergeImpl(MessageLite&, const MessageLite&);
// This std::string is allocated on the heap, but we use a raw pointer so that

@ -162,14 +162,14 @@ void UntypedMapBase::ClearTable(const ClearInput input) {
case kValueIsProto:
loop([size_info = input.size_info](NodeBase* node) {
static_cast<MessageLite*>(node->GetVoidValue(size_info))
->~MessageLite();
->DestroyInstance(false);
});
break;
case kKeyIsString | kValueIsProto:
loop([size_info = input.size_info](NodeBase* node) {
static_cast<std::string*>(node->GetVoidKey())->~basic_string();
static_cast<MessageLite*>(node->GetVoidValue(size_info))
->~MessageLite();
->DestroyInstance(false);
});
break;
case kUseDestructFunc:

@ -2335,8 +2335,7 @@ TEST(MapEntryTest, ConstInit) {
// This verifies that `MapEntry` can be constant initialized.
PROTOBUF_CONSTINIT static MyMapEntry entry{};
// Use the object in some way to make sure the vtable is there.
const google::protobuf::Message* volatile m = &entry;
delete m->New();
EXPECT_NE("", absl::StrFormat("%p", &entry));
}
// Generated Message Test ===========================================

@ -246,7 +246,6 @@ inline void MaybePoisonAfterClear(Message* root);
// the internal library are allowed to create subclasses.
class PROTOBUF_EXPORT Message : public MessageLite {
public:
constexpr Message() = default;
Message(const Message&) = delete;
Message& operator=(const Message&) = delete;
@ -364,6 +363,9 @@ class PROTOBUF_EXPORT Message : public MessageLite {
const Reflection* GetReflection() const { return GetMetadata().reflection; }
protected:
constexpr Message() {}
using MessageLite::MessageLite;
// Get a struct containing the metadata for the Message, which is used in turn
// to implement GetDescriptor() and GetReflection() above.
Metadata GetMetadata() const;
@ -372,7 +374,6 @@ class PROTOBUF_EXPORT Message : public MessageLite {
// For CODE_SIZE types
static bool IsInitializedImpl(const MessageLite&);
inline explicit Message(Arena* arena) : MessageLite(arena) {}
size_t ComputeUnknownFieldsSize(size_t total_size,
internal::CachedSize* cached_size) const;
size_t MaybeComputeUnknownFieldsSize(size_t total_size,

@ -45,6 +45,11 @@
namespace google {
namespace protobuf {
void MessageLite::DestroyInstance(bool free_memory) {
ABSL_DCHECK(!free_memory);
this->~MessageLite();
}
void MessageLite::CheckTypeAndMergeFrom(const MessageLite& other) {
auto* data = GetClassData();
auto* other_data = other.GetClassData();

@ -214,7 +214,6 @@ PROTOBUF_EXPORT size_t StringSpaceUsedExcludingSelfLong(const std::string& str);
// the internal library are allowed to create subclasses.
class PROTOBUF_EXPORT MessageLite {
public:
constexpr MessageLite() = default;
MessageLite(const MessageLite&) = delete;
MessageLite& operator=(const MessageLite&) = delete;
virtual ~MessageLite() = default;
@ -536,8 +535,6 @@ class PROTOBUF_EXPORT MessageLite {
return tc_table;
}
inline explicit MessageLite(Arena* arena) : _internal_metadata_(arena) {}
// We use a secondary vtable for descriptor based methods. This way ClassData
// does not grow with the number of descriptor methods. This avoids extra
// costs in MessageLite.
@ -548,6 +545,7 @@ class PROTOBUF_EXPORT MessageLite {
size_t (*space_used_long)(const MessageLite&);
};
struct ClassDataFull;
// Note: The order of arguments in the functions is chosen so that it has
// the same ABI as the member function that calls them. Eg the `this`
// pointer becomes the first argument in the free function.
@ -626,6 +624,9 @@ class PROTOBUF_EXPORT MessageLite {
void (*get_metadata_tracker)();
};
explicit constexpr MessageLite() {}
explicit MessageLite(Arena* arena) : _internal_metadata_(arena) {}
// GetClassData() returns a pointer to a ClassData struct which
// exists in global memory and is unique to each subclass. This uniqueness
// property is used in order to quickly determine whether two messages are
@ -689,6 +690,7 @@ class PROTOBUF_EXPORT MessageLite {
friend class internal::SwapFieldHelper;
friend class internal::TcParser;
friend class internal::TypeId;
friend class internal::UntypedMapBase;
friend class internal::WeakFieldMap;
friend class internal::WireFormatLite;
@ -703,6 +705,10 @@ class PROTOBUF_EXPORT MessageLite {
bool MergeFromImpl(io::CodedInputStream* input, ParseFlags parse_flags);
// Runs the destructor for this instance, and if `free_memory` is true,
// also frees the memory.
void DestroyInstance(bool free_memory);
template <typename T, const void* ptr = T::_raw_default_instance_>
static constexpr auto GetStrongPointerForTypeImpl(int) {
return ptr;

Loading…
Cancel
Save