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
diff --git a/upb/mini_table/common.c b/upb/mini_table/common.c
index 63520cc..c0f89f9 100644
--- a/upb/mini_table/common.c
+++ b/upb/mini_table/common.c
@@ -82,19 +82,6 @@
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 d72d514..c3bc5b7 100644
--- a/upb/mini_table/common.h
+++ b/upb/mini_table/common.h
@@ -61,10 +61,22 @@
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 a45f339..ff5c1e5 100644
--- a/upb/reflection/message_def.c
+++ b/upb/reflection/message_def.c
@@ -499,6 +499,7 @@
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));
}