diff --git a/src/google/protobuf/compiler/cpp/helpers.cc b/src/google/protobuf/compiler/cpp/helpers.cc index 047a52709e..78e2832771 100644 --- a/src/google/protobuf/compiler/cpp/helpers.cc +++ b/src/google/protobuf/compiler/cpp/helpers.cc @@ -215,7 +215,7 @@ internal::field_layout::TransformValidation GetLazyStyle( absl::flat_hash_map MessageVars( const Descriptor* desc) { - absl::string_view prefix = IsMapEntryMessage(desc) ? "" : "_impl_."; + absl::string_view prefix = "_impl_."; return { {"any_metadata", absl::StrCat(prefix, "_any_metadata_")}, {"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) { - absl::string_view prefix = - IsMapEntryMessage(field->containing_type()) ? "" : "_impl_."; + absl::string_view prefix = "_impl_."; absl::string_view split_prefix = split ? "_split_->" : ""; if (field->real_containing_oneof() == nullptr) { return absl::StrCat(prefix, split_prefix, FieldName(field), "_"); diff --git a/src/google/protobuf/compiler/cpp/message.cc b/src/google/protobuf/compiler/cpp/message.cc index 61ace77f73..37af63340a 100644 --- a/src/google/protobuf/compiler/cpp/message.cc +++ b/src/google/protobuf/compiler/cpp/message.cc @@ -1286,6 +1286,7 @@ void MessageGenerator::GenerateMapEntryClassDefinition(io::Printer* p) { &_$classname$_default_instance_); } )cc"); + parse_function_generator_->GenerateDataDecls(p); p->Emit(R"cc( const $superclass$::ClassData* GetClassData() const PROTOBUF_FINAL; static const $superclass$::ClassDataFull _class_data_; @@ -2155,6 +2156,7 @@ void MessageGenerator::GenerateClassMethods(io::Printer* p) { $verify$; $class_data$; )cc"); + parse_function_generator_->GenerateDataDefinitions(p); return; } if (IsAnyMessage(descriptor_)) { @@ -3720,19 +3722,6 @@ void MessageGenerator::GenerateClassData(io::Printer* p) { {"is_initialized", is_initialized}, {"pin_weak_descriptor", pin_weak_descriptor}, {"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", [&] { if (HasTracker(descriptor_, options_)) { @@ -3752,7 +3741,7 @@ void MessageGenerator::GenerateClassData(io::Printer* p) { const ::$proto_ns$::MessageLite::ClassDataFull $classname$::_class_data_ = { $superclass$::ClassData{ - $table$, + &_table_.header, $on_demand_register_arena_dtor$, $is_initialized$, &$classname$::MergeImpl, diff --git a/src/google/protobuf/map_entry.h b/src/google/protobuf/map_entry.h index 16145c9b04..71dda48b9f 100644 --- a/src/google/protobuf/map_entry.h +++ b/src/google/protobuf/map_entry.h @@ -95,9 +95,9 @@ class MapEntry : public Message { ~MapEntry() PROTOBUF_OVERRIDE { if (GetArena() != nullptr) return; - Message::_internal_metadata_.template Delete(); - KeyTypeHandler::DeleteNoArena(key_); - ValueTypeHandler::DeleteNoArena(value_); + this->_internal_metadata_.template Delete(); + KeyTypeHandler::DeleteNoArena(_impl_.key_); + ValueTypeHandler::DeleteNoArena(_impl_.value_); } using InternalArenaConstructable_ = void; @@ -107,14 +107,29 @@ class MapEntry : public Message { return Arena::Create(arena); } + struct _Internal; + protected: friend class google::protobuf::Arena; - HasBits<1> _has_bits_{}; - mutable CachedSize _cached_size_{}; + // Field naming follows the convention of generated messages to make code + // sharing easier. + struct { + HasBits<1> _has_bits_{}; + mutable CachedSize _cached_size_{}; + + KeyOnMemory key_{KeyTypeHandler::Constinit()}; + ValueOnMemory value_{ValueTypeHandler::Constinit()}; + } _impl_; +}; - KeyOnMemory key_{KeyTypeHandler::Constinit()}; - ValueOnMemory value_{ValueTypeHandler::Constinit()}; +template +struct MapEntry::_Internal { + static constexpr ::int32_t kHasBitsOffset = + 8 * PROTOBUF_FIELD_OFFSET(MapEntry, _impl_._has_bits_); }; } // namespace internal