Skip to content

Commit

Permalink
[ObjC] Only use the enum descriptor close/open state.
Browse files Browse the repository at this point in the history
Historically this was tracked on the fields, but the state is
now always on the enum descriptor. Update to ensure the two trackings
match, but move the functionality over to use the info from the
descriptor so the field part can eventually be mored.

PiperOrigin-RevId: 721012133
  • Loading branch information
thomasvl authored and copybara-github committed Jan 29, 2025
1 parent 14cceb5 commit 7f3dce4
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 10 deletions.
13 changes: 13 additions & 0 deletions objectivec/GPBDescriptor.m
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,15 @@ - (instancetype)initWithFieldDescription:(void *)description
NSAssert((coreDesc->flags & GPBFieldHasEnumDescriptor) != 0,
@"Field must have GPBFieldHasEnumDescriptor set");
#endif // DEBUG
#if defined(DEBUG) && DEBUG && !defined(NS_BLOCK_ASSERTIONS)
if (enumDescriptor_.isClosed) {
NSAssert((coreDesc->flags & GPBFieldClosedEnum) != 0,
@"Field must have GPBFieldClosedEnum set");
} else {
NSAssert((coreDesc->flags & GPBFieldClosedEnum) == 0,
@"Field must not have GPBFieldClosedEnum set");
}
#endif // defined(DEBUG) && DEBUG && !NS_BLOCK_ASSERTIONS
}

BOOL isMapOrArray = GPBFieldIsMapOrArray(self);
Expand Down Expand Up @@ -781,6 +790,10 @@ - (BOOL)isClosed {
return (flags_ & GPBEnumDescriptorInitializationFlag_IsClosed) != 0;
}

- (BOOL)isOpenOrValidValue:(int32_t)value {
return (flags_ & GPBEnumDescriptorInitializationFlag_IsClosed) == 0 || enumVerifier_(value);
}

- (void)calcValueNameOffsets {
@synchronized(self) {
if (nameOffsets_ != NULL) {
Expand Down
5 changes: 1 addition & 4 deletions objectivec/GPBDescriptor_PackagePrivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ typedef NS_OPTIONS(uint32_t, GPBEnumDescriptorInitializationFlags) {
flags:(GPBEnumDescriptorInitializationFlags)flags
extraTextFormatInfo:(const char *)extraTextFormatInfo;

- (BOOL)isOpenOrValidValue:(int32_t)value;
@end

@interface GPBExtensionDescriptor () {
Expand Down Expand Up @@ -281,10 +282,6 @@ GPB_INLINE uint32_t GPBFieldNumber(GPBFieldDescriptor *field) {
return field->description_->number;
}

GPB_INLINE BOOL GPBFieldIsClosedEnum(GPBFieldDescriptor *field) {
return (field->description_->flags & GPBFieldClosedEnum) != 0;
}

#pragma clang diagnostic pop

uint32_t GPBFieldTag(GPBFieldDescriptor *self);
Expand Down
2 changes: 1 addition & 1 deletion objectivec/GPBDictionary.m
Original file line number Diff line number Diff line change
Expand Up @@ -484,7 +484,7 @@ void GPBDictionaryReadEntry(id mapDictionary, GPBCodedInputStream *stream,
[(NSMutableDictionary *)mapDictionary setObject:value.valueString forKey:key.valueString];
} else {
if (valueDataType == GPBDataTypeEnum) {
if (!GPBFieldIsClosedEnum(field) || [field isValidEnumValue:value.valueEnum]) {
if ([field.enumDescriptor isOpenOrValidValue:value.valueEnum]) {
[mapDictionary setGPBGenericValue:&value forGPBGenericValueKey:&key];
} else {
NSData *data = [mapDictionary serializedDataForUnknownValue:value.valueEnum
Expand Down
6 changes: 3 additions & 3 deletions objectivec/GPBMessage.m
Original file line number Diff line number Diff line change
Expand Up @@ -2464,7 +2464,7 @@ static void MergeSingleFieldFromCodedInputStream(GPBMessage *self, GPBFieldDescr

case GPBDataTypeEnum: {
int32_t val = GPBCodedInputStreamReadEnum(&input->state_);
if (!GPBFieldIsClosedEnum(field) || [field isValidEnumValue:val]) {
if ([field.enumDescriptor isOpenOrValidValue:val]) {
GPBSetInt32IvarWithFieldPrivate(self, field, val);
} else {
AddUnknownFieldVarint32(self, GPBFieldNumber(field), val);
Expand Down Expand Up @@ -2513,7 +2513,7 @@ static void MergeRepeatedPackedFieldFromCodedInputStream(GPBMessage *self,

case GPBDataTypeEnum: {
int32_t val = GPBCodedInputStreamReadEnum(state);
if (!GPBFieldIsClosedEnum(field) || [field isValidEnumValue:val]) {
if ([field.enumDescriptor isOpenOrValidValue:val]) {
[(GPBEnumArray *)genericArray addRawValue:val];
} else {
AddUnknownFieldVarint32(self, GPBFieldNumber(field), val);
Expand Down Expand Up @@ -2581,7 +2581,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
}
case GPBDataTypeEnum: {
int32_t val = GPBCodedInputStreamReadEnum(state);
if (!GPBFieldIsClosedEnum(field) || [field isValidEnumValue:val]) {
if ([field.enumDescriptor isOpenOrValidValue:val]) {
[(GPBEnumArray *)genericArray addRawValue:val];
} else {
AddUnknownFieldVarint32(self, GPBFieldNumber(field), val);
Expand Down
3 changes: 1 addition & 2 deletions objectivec/GPBUtilities.m
Original file line number Diff line number Diff line change
Expand Up @@ -646,8 +646,7 @@ int32_t GPBGetMessageEnumField(GPBMessage *self, GPBFieldDescriptor *field) {
int32_t result = GPBGetMessageInt32Field(self, field);
// If this is presevering unknown enums, make sure the value is valid before
// returning it.

if (!GPBFieldIsClosedEnum(field) && ![field isValidEnumValue:result]) {
if (!field.enumDescriptor.isClosed && ![field isValidEnumValue:result]) {
result = kGPBUnrecognizedEnumeratorValue;
}
return result;
Expand Down

0 comments on commit 7f3dce4

Please sign in to comment.