From 532b4d0671c806f3f590fb0313b8fc73bd460c6d Mon Sep 17 00:00:00 2001 From: Protobuf Team Bot Date: Mon, 5 Jun 2023 14:01:56 -0700 Subject: [PATCH] Fix `upb_MiniTableField_CType()` to work correctly for enums & strings. `upb_MiniTableField_CType()` was directly checking the `descriptortype` in `upb_MiniTableField`, without taking `field->mode` into account -- which can indicate that an int32 is actually an enum, or that bytes is really a string. PiperOrigin-RevId: 537975302 --- upb/mini_table/common.c | 13 ------------- upb/mini_table/common.h | 16 ++++++++++++++-- upb/reflection/message_def.c | 1 + 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/upb/mini_table/common.c b/upb/mini_table/common.c index 63520cc1f2..c0f89f9f36 100644 --- a/upb/mini_table/common.c +++ b/upb/mini_table/common.c @@ -82,19 +82,6 @@ const upb_MiniTableField* upb_MiniTable_FindFieldByNumber( return NULL; } -upb_FieldType upb_MiniTableField_Type(const upb_MiniTableField* field) { - if (field->mode & kUpb_LabelFlags_IsAlternate) { - if (field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Int32) { - return kUpb_FieldType_Enum; - } else if (field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Bytes) { - return kUpb_FieldType_String; - } else { - UPB_ASSERT(false); - } - } - return field->UPB_PRIVATE(descriptortype); -} - static bool upb_MiniTable_Is_Oneof(const upb_MiniTableField* f) { return f->presence < 0; } diff --git a/upb/mini_table/common.h b/upb/mini_table/common.h index d72d5143e6..c3bc5b7175 100644 --- a/upb/mini_table/common.h +++ b/upb/mini_table/common.h @@ -61,10 +61,22 @@ UPB_API_INLINE const upb_MiniTableField* upb_MiniTable_GetFieldByIndex( return &t->fields[index]; } -UPB_API upb_FieldType upb_MiniTableField_Type(const upb_MiniTableField* field); +UPB_API_INLINE upb_FieldType +upb_MiniTableField_Type(const upb_MiniTableField* field) { + if (field->mode & kUpb_LabelFlags_IsAlternate) { + if (field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Int32) { + return kUpb_FieldType_Enum; + } else if (field->UPB_PRIVATE(descriptortype) == kUpb_FieldType_Bytes) { + return kUpb_FieldType_String; + } else { + UPB_ASSERT(false); + } + } + return (upb_FieldType)field->UPB_PRIVATE(descriptortype); +} UPB_API_INLINE upb_CType upb_MiniTableField_CType(const upb_MiniTableField* f) { - switch (f->UPB_PRIVATE(descriptortype)) { + switch (upb_MiniTableField_Type(f)) { case kUpb_FieldType_Double: return kUpb_CType_Double; case kUpb_FieldType_Float: diff --git a/upb/reflection/message_def.c b/upb/reflection/message_def.c index a45f339b0e..ff5c1e5b80 100644 --- a/upb/reflection/message_def.c +++ b/upb/reflection/message_def.c @@ -499,6 +499,7 @@ void _upb_MessageDef_LinkMiniTable(upb_DefBuilder* ctx, UPB_ASSERT(layout_index < m->layout->field_count); const upb_MiniTableField* mt_f = &m->layout->fields[layout_index]; UPB_ASSERT(upb_FieldDef_Type(f) == upb_MiniTableField_Type(mt_f)); + UPB_ASSERT(upb_FieldDef_CType(f) == upb_MiniTableField_CType(mt_f)); UPB_ASSERT(upb_FieldDef_HasPresence(f) == upb_MiniTableField_HasPresence(mt_f)); }