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. 21
      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(
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), "_");

@ -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,

@ -95,9 +95,9 @@ class MapEntry : public Message {
~MapEntry() PROTOBUF_OVERRIDE {
if (GetArena() != nullptr) return;
Message::_internal_metadata_.template Delete<UnknownFieldSet>();
KeyTypeHandler::DeleteNoArena(key_);
ValueTypeHandler::DeleteNoArena(value_);
this->_internal_metadata_.template Delete<UnknownFieldSet>();
KeyTypeHandler::DeleteNoArena(_impl_.key_);
ValueTypeHandler::DeleteNoArena(_impl_.value_);
}
using InternalArenaConstructable_ = void;
@ -107,14 +107,29 @@ class MapEntry : public Message {
return Arena::Create<Derived>(arena);
}
struct _Internal;
protected:
friend class google::protobuf::Arena;
// 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_;
};
template <typename Derived, typename Key, typename Value,
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

Loading…
Cancel
Save