Change MapEntry instances to also generate a TDP table.

PiperOrigin-RevId: 643051561
pull/17136/head
Protobuf Team Bot 9 months ago committed by Copybara-Service
parent 8ef32176e3
commit 091492ede1
  1. 5
      src/google/protobuf/compiler/cpp/helpers.cc
  2. 17
      src/google/protobuf/compiler/cpp/message.cc
  3. 29
      src/google/protobuf/map_entry.h

@ -215,7 +215,7 @@ internal::field_layout::TransformValidation GetLazyStyle(
absl::flat_hash_map<absl::string_view, std::string> MessageVars( absl::flat_hash_map<absl::string_view, std::string> MessageVars(
const Descriptor* desc) { const Descriptor* desc) {
absl::string_view prefix = IsMapEntryMessage(desc) ? "" : "_impl_."; absl::string_view prefix = "_impl_.";
return { return {
{"any_metadata", absl::StrCat(prefix, "_any_metadata_")}, {"any_metadata", absl::StrCat(prefix, "_any_metadata_")},
{"cached_size", absl::StrCat(prefix, "_cached_size_")}, {"cached_size", absl::StrCat(prefix, "_cached_size_")},
@ -540,8 +540,7 @@ std::string FieldName(const FieldDescriptor* field) {
} }
std::string FieldMemberName(const FieldDescriptor* field, bool split) { std::string FieldMemberName(const FieldDescriptor* field, bool split) {
absl::string_view prefix = absl::string_view prefix = "_impl_.";
IsMapEntryMessage(field->containing_type()) ? "" : "_impl_.";
absl::string_view split_prefix = split ? "_split_->" : ""; absl::string_view split_prefix = split ? "_split_->" : "";
if (field->real_containing_oneof() == nullptr) { if (field->real_containing_oneof() == nullptr) {
return absl::StrCat(prefix, split_prefix, FieldName(field), "_"); return absl::StrCat(prefix, split_prefix, FieldName(field), "_");

@ -1286,6 +1286,7 @@ void MessageGenerator::GenerateMapEntryClassDefinition(io::Printer* p) {
&_$classname$_default_instance_); &_$classname$_default_instance_);
} }
)cc"); )cc");
parse_function_generator_->GenerateDataDecls(p);
p->Emit(R"cc( p->Emit(R"cc(
const $superclass$::ClassData* GetClassData() const PROTOBUF_FINAL; const $superclass$::ClassData* GetClassData() const PROTOBUF_FINAL;
static const $superclass$::ClassDataFull _class_data_; static const $superclass$::ClassDataFull _class_data_;
@ -2155,6 +2156,7 @@ void MessageGenerator::GenerateClassMethods(io::Printer* p) {
$verify$; $verify$;
$class_data$; $class_data$;
)cc"); )cc");
parse_function_generator_->GenerateDataDefinitions(p);
return; return;
} }
if (IsAnyMessage(descriptor_)) { if (IsAnyMessage(descriptor_)) {
@ -3720,19 +3722,6 @@ void MessageGenerator::GenerateClassData(io::Printer* p) {
{"is_initialized", is_initialized}, {"is_initialized", is_initialized},
{"pin_weak_descriptor", pin_weak_descriptor}, {"pin_weak_descriptor", pin_weak_descriptor},
{"custom_vtable_methods", custom_vtable_methods}, {"custom_vtable_methods", custom_vtable_methods},
{"table",
[&] {
// Map entries use the dynamic parser.
if (IsMapEntryMessage(descriptor_)) {
p->Emit(R"cc(
nullptr, // tc_table
)cc");
} else {
p->Emit(R"cc(
&_table_.header,
)cc");
}
}},
{"tracker_on_get_metadata", {"tracker_on_get_metadata",
[&] { [&] {
if (HasTracker(descriptor_, options_)) { if (HasTracker(descriptor_, options_)) {
@ -3752,7 +3741,7 @@ void MessageGenerator::GenerateClassData(io::Printer* p) {
const ::$proto_ns$::MessageLite::ClassDataFull const ::$proto_ns$::MessageLite::ClassDataFull
$classname$::_class_data_ = { $classname$::_class_data_ = {
$superclass$::ClassData{ $superclass$::ClassData{
$table$, &_table_.header,
$on_demand_register_arena_dtor$, $on_demand_register_arena_dtor$,
$is_initialized$, $is_initialized$,
&$classname$::MergeImpl, &$classname$::MergeImpl,

@ -95,9 +95,9 @@ class MapEntry : public Message {
~MapEntry() PROTOBUF_OVERRIDE { ~MapEntry() PROTOBUF_OVERRIDE {
if (GetArena() != nullptr) return; if (GetArena() != nullptr) return;
Message::_internal_metadata_.template Delete<UnknownFieldSet>(); this->_internal_metadata_.template Delete<UnknownFieldSet>();
KeyTypeHandler::DeleteNoArena(key_); KeyTypeHandler::DeleteNoArena(_impl_.key_);
ValueTypeHandler::DeleteNoArena(value_); ValueTypeHandler::DeleteNoArena(_impl_.value_);
} }
using InternalArenaConstructable_ = void; using InternalArenaConstructable_ = void;
@ -107,14 +107,29 @@ class MapEntry : public Message {
return Arena::Create<Derived>(arena); return Arena::Create<Derived>(arena);
} }
struct _Internal;
protected: protected:
friend class google::protobuf::Arena; friend class google::protobuf::Arena;
HasBits<1> _has_bits_{}; // Field naming follows the convention of generated messages to make code
mutable CachedSize _cached_size_{}; // sharing easier.
struct {
HasBits<1> _has_bits_{};
mutable CachedSize _cached_size_{};
KeyOnMemory key_{KeyTypeHandler::Constinit()};
ValueOnMemory value_{ValueTypeHandler::Constinit()};
} _impl_;
};
KeyOnMemory key_{KeyTypeHandler::Constinit()}; template <typename Derived, typename Key, typename Value,
ValueOnMemory value_{ValueTypeHandler::Constinit()}; WireFormatLite::FieldType kKeyFieldType,
WireFormatLite::FieldType kValueFieldType>
struct MapEntry<Derived, Key, Value, kKeyFieldType,
kValueFieldType>::_Internal {
static constexpr ::int32_t kHasBitsOffset =
8 * PROTOBUF_FIELD_OFFSET(MapEntry, _impl_._has_bits_);
}; };
} // namespace internal } // namespace internal

Loading…
Cancel
Save