upb: add upb_MiniTableExtension_CType()

PiperOrigin-RevId: 599313198
pull/15472/head
Eric Salo 10 months ago committed by Copybara-Service
parent 8eb7c63ee7
commit 7c5ff29979
  1. 3
      upb/message/promote.c
  2. 8
      upb/mini_table/extension.h
  3. 6
      upb/mini_table/internal/extension.h
  4. 3
      upb/test/fuzz_util.cc
  5. 12
      upb/wire/decode.c

@ -67,8 +67,7 @@ static upb_UnknownToMessageRet upb_MiniTable_ParseUnknownMessage(
upb_GetExtension_Status upb_MiniTable_GetOrPromoteExtension( upb_GetExtension_Status upb_MiniTable_GetOrPromoteExtension(
upb_Message* msg, const upb_MiniTableExtension* ext_table, upb_Message* msg, const upb_MiniTableExtension* ext_table,
int decode_options, upb_Arena* arena, const upb_Extension** extension) { int decode_options, upb_Arena* arena, const upb_Extension** extension) {
UPB_ASSERT(upb_MiniTableField_CType(upb_MiniTableExtension_AsField( UPB_ASSERT(upb_MiniTableExtension_CType(ext_table) == kUpb_CType_Message);
ext_table)) == kUpb_CType_Message);
*extension = _upb_Message_Getext(msg, ext_table); *extension = _upb_Message_Getext(msg, ext_table);
if (*extension) { if (*extension) {
return kUpb_GetExtension_Ok; return kUpb_GetExtension_Ok;

@ -10,7 +10,7 @@
#include <stdint.h> #include <stdint.h>
#include "upb/mini_table/field.h" #include "upb/base/descriptor_constants.h"
#include "upb/mini_table/internal/extension.h" #include "upb/mini_table/internal/extension.h"
#include "upb/mini_table/message.h" #include "upb/mini_table/message.h"
@ -23,9 +23,9 @@ typedef struct upb_MiniTableExtension upb_MiniTableExtension;
extern "C" { extern "C" {
#endif #endif
UPB_API_INLINE const upb_MiniTableField* upb_MiniTableExtension_AsField( UPB_API_INLINE upb_CType
const upb_MiniTableExtension* e) { upb_MiniTableExtension_CType(const upb_MiniTableExtension* e) {
return UPB_PRIVATE(_upb_MiniTableExtension_AsField)(e); return UPB_PRIVATE(_upb_MiniTableExtension_CType)(e);
} }
UPB_API_INLINE uint32_t UPB_API_INLINE uint32_t

@ -28,9 +28,9 @@ struct upb_MiniTableExtension {
extern "C" { extern "C" {
#endif #endif
UPB_INLINE const struct upb_MiniTableField* UPB_PRIVATE( UPB_INLINE upb_CType UPB_PRIVATE(_upb_MiniTableExtension_CType)(
_upb_MiniTableExtension_AsField)(const struct upb_MiniTableExtension* e) { const struct upb_MiniTableExtension* e) {
return (const struct upb_MiniTableField*)&e->UPB_PRIVATE(field); return UPB_PRIVATE(_upb_MiniTableField_CType)(&e->UPB_PRIVATE(field));
} }
UPB_INLINE uint32_t UPB_PRIVATE(_upb_MiniTableExtension_Number)( UPB_INLINE uint32_t UPB_PRIVATE(_upb_MiniTableExtension_Number)(

@ -96,8 +96,7 @@ void Builder::BuildEnums() {
} }
bool Builder::LinkExtension(upb_MiniTableExtension* ext) { bool Builder::LinkExtension(upb_MiniTableExtension* ext) {
upb_MiniTableField* field = upb_MiniTableField* field = &ext->UPB_PRIVATE(field);
(upb_MiniTableField*)upb_MiniTableExtension_AsField(ext);
if (upb_MiniTableField_CType(field) == kUpb_CType_Message) { if (upb_MiniTableField_CType(field) == kUpb_CType_Message) {
auto mt = NextMiniTable(); auto mt = NextMiniTable();
if (!mt) field->UPB_PRIVATE(descriptortype) = kUpb_FieldType_Int32; if (!mt) field->UPB_PRIVATE(descriptortype) = kUpb_FieldType_Int32;

@ -820,7 +820,7 @@ static void upb_Decoder_AddKnownMessageSetItem(
_upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_OutOfMemory); _upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_OutOfMemory);
} }
upb_Message* submsg = _upb_Decoder_NewSubMessage( upb_Message* submsg = _upb_Decoder_NewSubMessage(
d, &ext->ext->UPB_PRIVATE(sub), upb_MiniTableExtension_AsField(ext->ext), d, &ext->ext->UPB_PRIVATE(sub), &ext->ext->UPB_PRIVATE(field),
(upb_TaggedMessagePtr*)&ext->data); (upb_TaggedMessagePtr*)&ext->data);
upb_DecodeStatus status = upb_Decode( upb_DecodeStatus status = upb_Decode(
data, size, submsg, upb_MiniTableExtension_GetSubMessage(item_mt), data, size, submsg, upb_MiniTableExtension_GetSubMessage(item_mt),
@ -930,13 +930,13 @@ static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,
size_t idx = ((size_t)field_number) - 1; // 0 wraps to SIZE_MAX size_t idx = ((size_t)field_number) - 1; // 0 wraps to SIZE_MAX
if (idx < t->UPB_PRIVATE(dense_below)) { if (idx < t->UPB_PRIVATE(dense_below)) {
/* Fastest case: index into dense fields. */ // Fastest case: index into dense fields.
goto found; goto found;
} }
if (t->UPB_PRIVATE(dense_below) < t->UPB_PRIVATE(field_count)) { if (t->UPB_PRIVATE(dense_below) < t->UPB_PRIVATE(field_count)) {
/* Linear search non-dense fields. Resume scanning from last_field_index // Linear search non-dense fields. Resume scanning from last_field_index
* since fields are usually in order. */ // since fields are usually in order.
size_t last = *last_field_index; size_t last = *last_field_index;
for (idx = last; idx < t->UPB_PRIVATE(field_count); idx++) { for (idx = last; idx < t->UPB_PRIVATE(field_count); idx++) {
if (t->UPB_PRIVATE(fields)[idx].UPB_PRIVATE(number) == field_number) { if (t->UPB_PRIVATE(fields)[idx].UPB_PRIVATE(number) == field_number) {
@ -956,7 +956,7 @@ static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,
case kUpb_ExtMode_Extendable: { case kUpb_ExtMode_Extendable: {
const upb_MiniTableExtension* ext = const upb_MiniTableExtension* ext =
upb_ExtensionRegistry_Lookup(d->extreg, t, field_number); upb_ExtensionRegistry_Lookup(d->extreg, t, field_number);
if (ext) return upb_MiniTableExtension_AsField(ext); if (ext) return &ext->UPB_PRIVATE(field);
break; break;
} }
case kUpb_ExtMode_IsMessageSet: case kUpb_ExtMode_IsMessageSet:
@ -969,7 +969,7 @@ static const upb_MiniTableField* _upb_Decoder_FindField(upb_Decoder* d,
} }
} }
return &none; /* Unknown field. */ return &none; // Unknown field.
found: found:
UPB_ASSERT(t->UPB_PRIVATE(fields)[idx].UPB_PRIVATE(number) == field_number); UPB_ASSERT(t->UPB_PRIVATE(fields)[idx].UPB_PRIVATE(number) == field_number);

Loading…
Cancel
Save