Remove a layer of indirection from looking up submessages.

It's not clear why this is here - all tests passed removing it, it's immediately derefed...

PiperOrigin-RevId: 728541232
test_728541232
Protobuf Team Bot 6 days ago committed by Copybara-Service
parent d21e8ef1d5
commit 37dd25b408
  1. 8
      upb/mini_descriptor/decode.c
  2. 2
      upb/mini_descriptor/link.c
  3. 2
      upb/mini_table/internal/message.h
  4. 2
      upb/mini_table/internal/sub.h
  5. 6
      upb/wire/decode.c
  6. 4
      upb/wire/encode.c
  7. 11
      upb_generator/minitable/generator.cc

@ -399,15 +399,11 @@ static void upb_MtDecoder_AllocateSubs(upb_MtDecoder* d,
upb_SubCounts sub_counts) { upb_SubCounts sub_counts) {
uint32_t total_count = sub_counts.submsg_count + sub_counts.subenum_count; uint32_t total_count = sub_counts.submsg_count + sub_counts.subenum_count;
size_t subs_bytes = sizeof(*d->table->UPB_PRIVATE(subs)) * total_count; size_t subs_bytes = sizeof(*d->table->UPB_PRIVATE(subs)) * total_count;
size_t ptrs_bytes = sizeof(upb_MiniTable*) * sub_counts.submsg_count;
upb_MiniTableSubInternal* subs = upb_Arena_Malloc(d->arena, subs_bytes); upb_MiniTableSubInternal* subs = upb_Arena_Malloc(d->arena, subs_bytes);
const upb_MiniTable** subs_ptrs = upb_Arena_Malloc(d->arena, ptrs_bytes);
upb_MdDecoder_CheckOutOfMemory(&d->base, subs); upb_MdDecoder_CheckOutOfMemory(&d->base, subs);
upb_MdDecoder_CheckOutOfMemory(&d->base, subs_ptrs);
uint32_t i = 0; uint32_t i = 0;
for (; i < sub_counts.submsg_count; i++) { for (; i < sub_counts.submsg_count; i++) {
subs_ptrs[i] = UPB_PRIVATE(_upb_MiniTable_Empty)(); subs[i].UPB_PRIVATE(submsg) = UPB_PRIVATE(_upb_MiniTable_Empty)();
subs[i].UPB_PRIVATE(submsg) = &subs_ptrs[i];
} }
if (sub_counts.subenum_count) { if (sub_counts.subenum_count) {
upb_MiniTableField* f = d->fields; upb_MiniTableField* f = d->fields;
@ -417,7 +413,7 @@ static void upb_MtDecoder_AllocateSubs(upb_MtDecoder* d,
f->UPB_PRIVATE(submsg_index) += sub_counts.submsg_count; f->UPB_PRIVATE(submsg_index) += sub_counts.submsg_count;
} }
} }
for (; i < sub_counts.submsg_count + sub_counts.subenum_count; i++) { for (; i < total_count; i++) {
subs[i].UPB_PRIVATE(subenum) = NULL; subs[i].UPB_PRIVATE(subenum) = NULL;
} }
} }

@ -59,7 +59,7 @@ bool upb_MiniTable_SetSubMessage(upb_MiniTable* table,
// TODO: Add this assert back once YouTube is updated to not call // TODO: Add this assert back once YouTube is updated to not call
// this function repeatedly. // this function repeatedly.
// UPB_ASSERT(UPB_PRIVATE(_upb_MiniTable_IsEmpty)(table_sub->submsg)); // UPB_ASSERT(UPB_PRIVATE(_upb_MiniTable_IsEmpty)(table_sub->submsg));
memcpy((void*)table_subs[idx].UPB_PRIVATE(submsg), &sub, sizeof(void*)); table_subs[idx].UPB_PRIVATE(submsg) = sub;
return true; return true;
} }

@ -113,7 +113,7 @@ UPB_API_INLINE const struct upb_MiniTableField* upb_MiniTable_GetFieldByIndex(
UPB_INLINE const struct upb_MiniTable* UPB_PRIVATE( UPB_INLINE const struct upb_MiniTable* UPB_PRIVATE(
_upb_MiniTable_GetSubTableByIndex)(const struct upb_MiniTable* m, _upb_MiniTable_GetSubTableByIndex)(const struct upb_MiniTable* m,
uint32_t i) { uint32_t i) {
return *m->UPB_PRIVATE(subs)[i].UPB_PRIVATE(submsg); return m->UPB_PRIVATE(subs)[i].UPB_PRIVATE(submsg);
} }
UPB_API_INLINE const struct upb_MiniTable* upb_MiniTable_SubMessage( UPB_API_INLINE const struct upb_MiniTable* upb_MiniTable_SubMessage(

@ -12,7 +12,7 @@
#include "upb/port/def.inc" #include "upb/port/def.inc"
typedef union { typedef union {
const struct upb_MiniTable* const* UPB_PRIVATE(submsg); const struct upb_MiniTable* UPB_PRIVATE(submsg);
const struct upb_MiniTableEnum* UPB_PRIVATE(subenum); const struct upb_MiniTableEnum* UPB_PRIVATE(subenum);
} upb_MiniTableSubInternal; } upb_MiniTableSubInternal;

@ -98,7 +98,7 @@ typedef union {
// from an array of MiniTableSubs. // from an array of MiniTableSubs.
static const upb_MiniTable* _upb_MiniTableSubs_MessageByField( static const upb_MiniTable* _upb_MiniTableSubs_MessageByField(
const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) { const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) {
return *subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(submsg); return subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(submsg);
} }
// Returns the MiniTableEnum corresponding to a given MiniTableField // Returns the MiniTableEnum corresponding to a given MiniTableField
@ -1033,7 +1033,7 @@ void _upb_Decoder_CheckUnlinked(upb_Decoder* d, const upb_MiniTable* mt,
do { do {
UPB_ASSERT(upb_MiniTableField_CType(oneof) == kUpb_CType_Message); UPB_ASSERT(upb_MiniTableField_CType(oneof) == kUpb_CType_Message);
const upb_MiniTable* oneof_sub = const upb_MiniTable* oneof_sub =
*mt->UPB_PRIVATE(subs)[oneof->UPB_PRIVATE(submsg_index)].UPB_PRIVATE( mt->UPB_PRIVATE(subs)[oneof->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(
submsg); submsg);
UPB_ASSERT(!oneof_sub); UPB_ASSERT(!oneof_sub);
} while (upb_MiniTable_NextOneofField(mt, &oneof)); } while (upb_MiniTable_NextOneofField(mt, &oneof));
@ -1188,7 +1188,7 @@ const char* _upb_Decoder_DecodeKnownField(upb_Decoder* d, const char* ptr,
msg = &ext->data.UPB_PRIVATE(ext_msg_val); msg = &ext->data.UPB_PRIVATE(ext_msg_val);
if (upb_MiniTableField_IsSubMessage(&ext->ext->UPB_PRIVATE(field))) { if (upb_MiniTableField_IsSubMessage(&ext->ext->UPB_PRIVATE(field))) {
ext_sub.UPB_PRIVATE(submsg) = ext_sub.UPB_PRIVATE(submsg) =
&ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg); ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg);
} else { } else {
ext_sub.UPB_PRIVATE(subenum) = ext_sub.UPB_PRIVATE(subenum) =
ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(subenum); ext->ext->UPB_PRIVATE(sub).UPB_PRIVATE(subenum);

@ -49,7 +49,7 @@
// from an array of MiniTableSubs. // from an array of MiniTableSubs.
static const upb_MiniTable* _upb_Encoder_GetSubMiniTable( static const upb_MiniTable* _upb_Encoder_GetSubMiniTable(
const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) { const upb_MiniTableSubInternal* subs, const upb_MiniTableField* field) {
return *subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(submsg); return subs[field->UPB_PRIVATE(submsg_index)].UPB_PRIVATE(submsg);
} }
#define UPB_PB_VARINT_MAX_LEN 10 #define UPB_PB_VARINT_MAX_LEN 10
@ -546,7 +546,7 @@ static void encode_ext(upb_encstate* e, const upb_MiniTableExtension* ext,
} else { } else {
upb_MiniTableSubInternal sub; upb_MiniTableSubInternal sub;
if (upb_MiniTableField_IsSubMessage(&ext->UPB_PRIVATE(field))) { if (upb_MiniTableField_IsSubMessage(&ext->UPB_PRIVATE(field))) {
sub.UPB_PRIVATE(submsg) = &ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg); sub.UPB_PRIVATE(submsg) = ext->UPB_PRIVATE(sub).UPB_PRIVATE(submsg);
} else { } else {
sub.UPB_PRIVATE(subenum) = ext->UPB_PRIVATE(sub).UPB_PRIVATE(subenum); sub.UPB_PRIVATE(subenum) = ext->UPB_PRIVATE(sub).UPB_PRIVATE(subenum);
} }

@ -1,4 +1,4 @@
// Protocol Buffers - Google's data interrdchange format // Protocol Buffers - Google's data interchange format
// Copyright 2023 Google LLC. All rights reserved. // Copyright 2023 Google LLC. All rights reserved.
// //
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
@ -83,11 +83,10 @@ void WriteMessageField(upb::FieldDefPtr field,
output(" $0,\n", upb::generator::FieldInitializer(field, field64, field32)); output(" $0,\n", upb::generator::FieldInitializer(field, field64, field32));
} }
std::string GetSub(upb::FieldDefPtr field, bool is_extension) { std::string GetSub(upb::FieldDefPtr field) {
if (auto message_def = field.message_type()) { if (auto message_def = field.message_type()) {
return absl::Substitute("{.UPB_PRIVATE(submsg) = &$0}", return absl::Substitute("{.UPB_PRIVATE(submsg) = &$0}",
is_extension ? MessageVarName(message_def) MessageVarName(message_def));
: MessagePtrVarName(message_def));
} }
if (auto enum_def = field.enum_subdef()) { if (auto enum_def = field.enum_subdef()) {
@ -122,7 +121,7 @@ void WriteMessage(upb::MessageDefPtr message, const DefPoolPair& pools,
if (index != kUpb_NoSub) { if (index != kUpb_NoSub) {
const int f_number = upb_MiniTableField_Number(f); const int f_number = upb_MiniTableField_Number(f);
upb::FieldDefPtr field = message.FindFieldByNumber(f_number); upb::FieldDefPtr field = message.FindFieldByNumber(f_number);
auto pair = subs.emplace(index, GetSub(field, false)); auto pair = subs.emplace(index, GetSub(field));
ABSL_CHECK(pair.second); ABSL_CHECK(pair.second);
if (options.one_output_per_message && field.IsSubMessage() && if (options.one_output_per_message && field.IsSubMessage() &&
IsCrossFile(field) && !upb_MiniTableField_IsMap(f)) { IsCrossFile(field) && !upb_MiniTableField_IsMap(f)) {
@ -242,7 +241,7 @@ void WriteExtension(const DefPoolPair& pools, upb::FieldDefPtr ext,
output("const upb_MiniTableExtension $0 = {\n ", ExtensionVarName(ext)); output("const upb_MiniTableExtension $0 = {\n ", ExtensionVarName(ext));
output("$0,\n", FieldInitializer(pools, ext)); output("$0,\n", FieldInitializer(pools, ext));
output(" &$0,\n", MessageVarName(ext.containing_type())); output(" &$0,\n", MessageVarName(ext.containing_type()));
output(" $0,\n", GetSub(ext, true)); output(" $0,\n", GetSub(ext));
output("\n};\n"); output("\n};\n");
} }

Loading…
Cancel
Save