Skip to content
This repository was archived by the owner on Dec 9, 2025. It is now read-only.

Commit 0c65313

Browse files
Merge GetEnum into GetInt32. Rename SetEnum to SetEnumProto2 to be clear that upb only treats Proto2 enum as enum. Proto3 enums should use SetInt32.
PiperOrigin-RevId: 467000685
1 parent 63a4a7d commit 0c65313

2 files changed

Lines changed: 14 additions & 10 deletions

File tree

upb/mini_table.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ UPB_INLINE const upb_MiniTable* upb_MiniTable_GetSubMessageTable(
4545
return mini_table->subs[field->submsg_index].submsg;
4646
}
4747

48+
UPB_INLINE const upb_MiniTable_Enum* upb_MiniTable_GetSubEnumTable(
49+
const upb_MiniTable* mini_table, const upb_MiniTable_Field* field) {
50+
return mini_table->subs[field->submsg_index].subenum;
51+
}
52+
4853
// Validates enum value against range defined by enum mini table.
4954
UPB_INLINE bool upb_MiniTable_Enum_CheckValue(const upb_MiniTable_Enum* e,
5055
int32_t val) {

upb/mini_table_accessors.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include "upb/array.h"
3232
#include "upb/internal/mini_table_accessors.h"
33+
#include "upb/mini_table.h"
3334
#include "upb/msg_internal.h"
3435

3536
// Must be last.
@@ -63,7 +64,8 @@ UPB_INLINE int32_t upb_MiniTable_GetInt32(const upb_Message* msg,
6364
const upb_MiniTable_Field* field) {
6465
UPB_ASSERT(field->descriptortype == kUpb_FieldType_Int32 ||
6566
field->descriptortype == kUpb_FieldType_SInt32 ||
66-
field->descriptortype == kUpb_FieldType_SFixed32);
67+
field->descriptortype == kUpb_FieldType_SFixed32 ||
68+
field->descriptortype == kUpb_FieldType_Enum);
6769
return *UPB_PTR_AT(msg, field->offset, int32_t);
6870
}
6971

@@ -93,16 +95,13 @@ UPB_INLINE void upb_MiniTable_SetUInt32(upb_Message* msg,
9395
*UPB_PTR_AT(msg, field->offset, uint32_t) = value;
9496
}
9597

96-
UPB_INLINE int32_t upb_MiniTable_GetEnum(const upb_Message* msg,
97-
const upb_MiniTable_Field* field) {
98-
UPB_ASSERT(field->descriptortype == kUpb_FieldType_Enum);
99-
return *UPB_PTR_AT(msg, field->offset, int32_t);
100-
}
101-
102-
UPB_INLINE void upb_MiniTable_SetEnum(upb_Message* msg,
103-
const upb_MiniTable_Field* field,
104-
int32_t value) {
98+
UPB_INLINE void upb_MiniTable_SetEnumProto2(upb_Message* msg,
99+
const upb_MiniTable* msg_mini_table,
100+
const upb_MiniTable_Field* field,
101+
int32_t value) {
105102
UPB_ASSERT(field->descriptortype == kUpb_FieldType_Enum);
103+
UPB_ASSERT(upb_MiniTable_Enum_CheckValue(
104+
upb_MiniTable_GetSubEnumTable(msg_mini_table, field), value));
106105
_upb_MiniTable_SetPresence(msg, field);
107106
*UPB_PTR_AT(msg, field->offset, int32_t) = value;
108107
}

0 commit comments

Comments
 (0)