| Index: third_party/protobuf/objectivec/GPBDescriptor.m
|
| diff --git a/third_party/protobuf/objectivec/GPBDescriptor.m b/third_party/protobuf/objectivec/GPBDescriptor.m
|
| index bae9187ee517e23fffa633b05e140e6f0e4865bd..2709737cad6ad26eda139af8d9a42880d2a63e16 100644
|
| --- a/third_party/protobuf/objectivec/GPBDescriptor.m
|
| +++ b/third_party/protobuf/objectivec/GPBDescriptor.m
|
| @@ -35,7 +35,6 @@
|
| #import "GPBUtilities_PackagePrivate.h"
|
| #import "GPBWireFormat.h"
|
| #import "GPBMessage_PackagePrivate.h"
|
| -#import "google/protobuf/Descriptor.pbobjc.h"
|
|
|
| // The address of this variable is used as a key for obj_getAssociatedObject.
|
| static const char kTextFormatExtraValueKey = 0;
|
| @@ -92,7 +91,6 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
|
|
| @implementation GPBDescriptor {
|
| Class messageClass_;
|
| - NSArray *enums_;
|
| GPBFileDescriptor *file_;
|
| BOOL wireFormat_;
|
| }
|
| @@ -100,7 +98,6 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
| @synthesize messageClass = messageClass_;
|
| @synthesize fields = fields_;
|
| @synthesize oneofs = oneofs_;
|
| -@synthesize enums = enums_;
|
| @synthesize extensionRanges = extensionRanges_;
|
| @synthesize extensionRangesCount = extensionRangesCount_;
|
| @synthesize file = file_;
|
| @@ -110,130 +107,58 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
| allocDescriptorForClass:(Class)messageClass
|
| rootClass:(Class)rootClass
|
| file:(GPBFileDescriptor *)file
|
| - fields:(GPBMessageFieldDescription *)fieldDescriptions
|
| - fieldCount:(NSUInteger)fieldCount
|
| - oneofs:(GPBMessageOneofDescription *)oneofDescriptions
|
| - oneofCount:(NSUInteger)oneofCount
|
| - enums:(GPBMessageEnumDescription *)enumDescriptions
|
| - enumCount:(NSUInteger)enumCount
|
| - ranges:(const GPBExtensionRange *)ranges
|
| - rangeCount:(NSUInteger)rangeCount
|
| - storageSize:(size_t)storageSize
|
| - wireFormat:(BOOL)wireFormat {
|
| + fields:(void *)fieldDescriptions
|
| + fieldCount:(uint32_t)fieldCount
|
| + storageSize:(uint32_t)storageSize
|
| + flags:(GPBDescriptorInitializationFlags)flags {
|
| + // The rootClass is no longer used, but it is passed in to ensure it
|
| + // was started up during initialization also.
|
| + (void)rootClass;
|
| NSMutableArray *fields = nil;
|
| - NSMutableArray *oneofs = nil;
|
| - NSMutableArray *enums = nil;
|
| - NSMutableArray *extensionRanges = nil;
|
| GPBFileSyntax syntax = file.syntax;
|
| - for (NSUInteger i = 0; i < fieldCount; ++i) {
|
| + BOOL fieldsIncludeDefault =
|
| + (flags & GPBDescriptorInitializationFlag_FieldsWithDefault) != 0;
|
| +
|
| + void *desc;
|
| + for (uint32_t i = 0; i < fieldCount; ++i) {
|
| if (fields == nil) {
|
| fields = [[NSMutableArray alloc] initWithCapacity:fieldCount];
|
| }
|
| - GPBFieldDescriptor *fieldDescriptor = [[GPBFieldDescriptor alloc]
|
| - initWithFieldDescription:&fieldDescriptions[i]
|
| - rootClass:rootClass
|
| - syntax:syntax];
|
| + // Need correctly typed pointer for array indexing below to work.
|
| + if (fieldsIncludeDefault) {
|
| + GPBMessageFieldDescriptionWithDefault *fieldDescWithDefault = fieldDescriptions;
|
| + desc = &(fieldDescWithDefault[i]);
|
| + } else {
|
| + GPBMessageFieldDescription *fieldDesc = fieldDescriptions;
|
| + desc = &(fieldDesc[i]);
|
| + }
|
| + GPBFieldDescriptor *fieldDescriptor =
|
| + [[GPBFieldDescriptor alloc] initWithFieldDescription:desc
|
| + includesDefault:fieldsIncludeDefault
|
| + syntax:syntax];
|
| [fields addObject:fieldDescriptor];
|
| [fieldDescriptor release];
|
| }
|
| - for (NSUInteger i = 0; i < oneofCount; ++i) {
|
| - if (oneofs == nil) {
|
| - oneofs = [[NSMutableArray alloc] initWithCapacity:oneofCount];
|
| - }
|
| - GPBMessageOneofDescription *oneofDescription = &oneofDescriptions[i];
|
| - NSArray *fieldsForOneof =
|
| - NewFieldsArrayForHasIndex(oneofDescription->index, fields);
|
| - GPBOneofDescriptor *oneofDescriptor =
|
| - [[GPBOneofDescriptor alloc] initWithOneofDescription:oneofDescription
|
| - fields:fieldsForOneof];
|
| - [oneofs addObject:oneofDescriptor];
|
| - [oneofDescriptor release];
|
| - [fieldsForOneof release];
|
| - }
|
| - for (NSUInteger i = 0; i < enumCount; ++i) {
|
| - if (enums == nil) {
|
| - enums = [[NSMutableArray alloc] initWithCapacity:enumCount];
|
| - }
|
| - GPBEnumDescriptor *enumDescriptor =
|
| - enumDescriptions[i].enumDescriptorFunc();
|
| - [enums addObject:enumDescriptor];
|
| - }
|
|
|
| + BOOL wireFormat = (flags & GPBDescriptorInitializationFlag_WireFormat) != 0;
|
| GPBDescriptor *descriptor = [[self alloc] initWithClass:messageClass
|
| file:file
|
| fields:fields
|
| - oneofs:oneofs
|
| - enums:enums
|
| - extensionRanges:ranges
|
| - extensionRangesCount:rangeCount
|
| storageSize:storageSize
|
| wireFormat:wireFormat];
|
| [fields release];
|
| - [oneofs release];
|
| - [enums release];
|
| - [extensionRanges release];
|
| - return descriptor;
|
| -}
|
| -
|
| -+ (instancetype)
|
| - allocDescriptorForClass:(Class)messageClass
|
| - rootClass:(Class)rootClass
|
| - file:(GPBFileDescriptor *)file
|
| - fields:(GPBMessageFieldDescription *)fieldDescriptions
|
| - fieldCount:(NSUInteger)fieldCount
|
| - oneofs:(GPBMessageOneofDescription *)oneofDescriptions
|
| - oneofCount:(NSUInteger)oneofCount
|
| - enums:(GPBMessageEnumDescription *)enumDescriptions
|
| - enumCount:(NSUInteger)enumCount
|
| - ranges:(const GPBExtensionRange *)ranges
|
| - rangeCount:(NSUInteger)rangeCount
|
| - storageSize:(size_t)storageSize
|
| - wireFormat:(BOOL)wireFormat
|
| - extraTextFormatInfo:(const char *)extraTextFormatInfo {
|
| - GPBDescriptor *descriptor = [self allocDescriptorForClass:messageClass
|
| - rootClass:rootClass
|
| - file:file
|
| - fields:fieldDescriptions
|
| - fieldCount:fieldCount
|
| - oneofs:oneofDescriptions
|
| - oneofCount:oneofCount
|
| - enums:enumDescriptions
|
| - enumCount:enumCount
|
| - ranges:ranges
|
| - rangeCount:rangeCount
|
| - storageSize:storageSize
|
| - wireFormat:wireFormat];
|
| - // Extra info is a compile time option, so skip the work if not needed.
|
| - if (extraTextFormatInfo) {
|
| - NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
|
| - for (GPBFieldDescriptor *fieldDescriptor in descriptor->fields_) {
|
| - if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
|
| - objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
|
| - extraInfoValue,
|
| - OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
| - }
|
| - }
|
| - }
|
| return descriptor;
|
| }
|
|
|
| - (instancetype)initWithClass:(Class)messageClass
|
| file:(GPBFileDescriptor *)file
|
| fields:(NSArray *)fields
|
| - oneofs:(NSArray *)oneofs
|
| - enums:(NSArray *)enums
|
| - extensionRanges:(const GPBExtensionRange *)extensionRanges
|
| - extensionRangesCount:(NSUInteger)extensionRangesCount
|
| - storageSize:(size_t)storageSize
|
| + storageSize:(uint32_t)storageSize
|
| wireFormat:(BOOL)wireFormat {
|
| if ((self = [super init])) {
|
| messageClass_ = messageClass;
|
| file_ = file;
|
| fields_ = [fields retain];
|
| - oneofs_ = [oneofs retain];
|
| - enums_ = [enums retain];
|
| - extensionRanges_ = extensionRanges;
|
| - extensionRangesCount_ = extensionRangesCount;
|
| storageSize_ = storageSize;
|
| wireFormat_ = wireFormat;
|
| }
|
| @@ -243,10 +168,47 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
| - (void)dealloc {
|
| [fields_ release];
|
| [oneofs_ release];
|
| - [enums_ release];
|
| [super dealloc];
|
| }
|
|
|
| +- (void)setupOneofs:(const char **)oneofNames
|
| + count:(uint32_t)count
|
| + firstHasIndex:(int32_t)firstHasIndex {
|
| + NSCAssert(firstHasIndex < 0, @"Should always be <0");
|
| + NSMutableArray *oneofs = [[NSMutableArray alloc] initWithCapacity:count];
|
| + for (uint32_t i = 0, hasIndex = firstHasIndex; i < count; ++i, --hasIndex) {
|
| + const char *name = oneofNames[i];
|
| + NSArray *fieldsForOneof = NewFieldsArrayForHasIndex(hasIndex, fields_);
|
| + NSCAssert(fieldsForOneof.count > 0,
|
| + @"No fields for this oneof? (%s:%d)", name, hasIndex);
|
| + GPBOneofDescriptor *oneofDescriptor =
|
| + [[GPBOneofDescriptor alloc] initWithName:name fields:fieldsForOneof];
|
| + [oneofs addObject:oneofDescriptor];
|
| + [oneofDescriptor release];
|
| + [fieldsForOneof release];
|
| + }
|
| + oneofs_ = oneofs;
|
| +}
|
| +
|
| +- (void)setupExtraTextInfo:(const char *)extraTextFormatInfo {
|
| + // Extra info is a compile time option, so skip the work if not needed.
|
| + if (extraTextFormatInfo) {
|
| + NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
|
| + for (GPBFieldDescriptor *fieldDescriptor in fields_) {
|
| + if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
|
| + objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
|
| + extraInfoValue,
|
| + OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +- (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count {
|
| + extensionRanges_ = ranges;
|
| + extensionRangesCount_ = count;
|
| +}
|
| +
|
| - (NSString *)name {
|
| return NSStringFromClass(messageClass_);
|
| }
|
| @@ -283,15 +245,6 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
| return nil;
|
| }
|
|
|
| -- (GPBEnumDescriptor *)enumWithName:(NSString *)name {
|
| - for (GPBEnumDescriptor *descriptor in enums_) {
|
| - if ([descriptor.name isEqual:name]) {
|
| - return descriptor;
|
| - }
|
| - }
|
| - return nil;
|
| -}
|
| -
|
| @end
|
|
|
| @implementation GPBFileDescriptor {
|
| @@ -318,19 +271,16 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
|
|
| @synthesize fields = fields_;
|
|
|
| -- (instancetype)initWithOneofDescription:
|
| - (GPBMessageOneofDescription *)oneofDescription
|
| - fields:(NSArray *)fields {
|
| +- (instancetype)initWithName:(const char *)name fields:(NSArray *)fields {
|
| self = [super init];
|
| if (self) {
|
| - NSAssert(oneofDescription->index < 0, @"Should always be <0");
|
| - oneofDescription_ = oneofDescription;
|
| + name_ = name;
|
| fields_ = [fields retain];
|
| for (GPBFieldDescriptor *fieldDesc in fields) {
|
| fieldDesc->containingOneof_ = self;
|
| }
|
|
|
| - caseSel_ = SelFromStrings(NULL, oneofDescription->name, "OneOfCase", NO);
|
| + caseSel_ = SelFromStrings(NULL, name, "OneOfCase", NO);
|
| }
|
| return self;
|
| }
|
| @@ -341,7 +291,7 @@ static NSArray *NewFieldsArrayForHasIndex(int hasIndex,
|
| }
|
|
|
| - (NSString *)name {
|
| - return @(oneofDescription_->name);
|
| + return @(name_);
|
| }
|
|
|
| - (GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber {
|
| @@ -389,7 +339,6 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
|
|
| @implementation GPBFieldDescriptor {
|
| GPBGenericValue defaultValue_;
|
| - GPBFieldOptions *fieldOptions_;
|
|
|
| // Message ivars
|
| Class msgClass_;
|
| @@ -403,7 +352,6 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| } enumHandling_;
|
| }
|
|
|
| -@synthesize fieldOptions = fieldOptions_;
|
| @synthesize msgClass = msgClass_;
|
| @synthesize containingOneof = containingOneof_;
|
|
|
| @@ -417,16 +365,21 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| return self;
|
| }
|
|
|
| -- (instancetype)initWithFieldDescription:
|
| - (GPBMessageFieldDescription *)description
|
| - rootClass:(Class)rootClass
|
| +- (instancetype)initWithFieldDescription:(void *)description
|
| + includesDefault:(BOOL)includesDefault
|
| syntax:(GPBFileSyntax)syntax {
|
| if ((self = [super init])) {
|
| - description_ = description;
|
| - getSel_ = sel_getUid(description->name);
|
| - setSel_ = SelFromStrings("set", description->name, NULL, YES);
|
| + GPBMessageFieldDescription *coreDesc;
|
| + if (includesDefault) {
|
| + coreDesc = &(((GPBMessageFieldDescriptionWithDefault *)description)->core);
|
| + } else {
|
| + coreDesc = description;
|
| + }
|
| + description_ = coreDesc;
|
| + getSel_ = sel_getUid(coreDesc->name);
|
| + setSel_ = SelFromStrings("set", coreDesc->name, NULL, YES);
|
|
|
| - GPBDataType dataType = description->dataType;
|
| + GPBDataType dataType = coreDesc->dataType;
|
| BOOL isMessage = GPBDataTypeIsMessage(dataType);
|
| BOOL isMapOrArray = GPBFieldIsMapOrArray(self);
|
|
|
| @@ -434,39 +387,39 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| // map<>/repeated fields get a *Count property (inplace of a has*) to
|
| // support checking if there are any entries without triggering
|
| // autocreation.
|
| - hasOrCountSel_ = SelFromStrings(NULL, description->name, "_Count", NO);
|
| + hasOrCountSel_ = SelFromStrings(NULL, coreDesc->name, "_Count", NO);
|
| } else {
|
| // If there is a positive hasIndex, then:
|
| // - All fields types for proto2 messages get has* selectors.
|
| // - Only message fields for proto3 messages get has* selectors.
|
| // Note: the positive check is to handle oneOfs, we can't check
|
| // containingOneof_ because it isn't set until after initialization.
|
| - if ((description->hasIndex >= 0) &&
|
| - (description->hasIndex != GPBNoHasBit) &&
|
| + if ((coreDesc->hasIndex >= 0) &&
|
| + (coreDesc->hasIndex != GPBNoHasBit) &&
|
| ((syntax != GPBFileSyntaxProto3) || isMessage)) {
|
| - hasOrCountSel_ = SelFromStrings("has", description->name, NULL, NO);
|
| - setHasSel_ = SelFromStrings("setHas", description->name, NULL, YES);
|
| + hasOrCountSel_ = SelFromStrings("has", coreDesc->name, NULL, NO);
|
| + setHasSel_ = SelFromStrings("setHas", coreDesc->name, NULL, YES);
|
| }
|
| }
|
|
|
| // Extra type specific data.
|
| if (isMessage) {
|
| - const char *className = description->dataTypeSpecific.className;
|
| + const char *className = coreDesc->dataTypeSpecific.className;
|
| msgClass_ = objc_getClass(className);
|
| NSAssert(msgClass_, @"Class %s not defined", className);
|
| } else if (dataType == GPBDataTypeEnum) {
|
| - if ((description_->flags & GPBFieldHasEnumDescriptor) != 0) {
|
| + if ((coreDesc->flags & GPBFieldHasEnumDescriptor) != 0) {
|
| enumHandling_.enumDescriptor_ =
|
| - description->dataTypeSpecific.enumDescFunc();
|
| + coreDesc->dataTypeSpecific.enumDescFunc();
|
| } else {
|
| enumHandling_.enumVerifier_ =
|
| - description->dataTypeSpecific.enumVerifier;
|
| + coreDesc->dataTypeSpecific.enumVerifier;
|
| }
|
| }
|
|
|
| - // Non map<>/repeated fields can have defaults.
|
| - if (!isMapOrArray) {
|
| - defaultValue_ = description->defaultValue;
|
| + // Non map<>/repeated fields can have defaults in proto2 syntax.
|
| + if (!isMapOrArray && includesDefault) {
|
| + defaultValue_ = ((GPBMessageFieldDescriptionWithDefault *)description)->defaultValue;
|
| if (dataType == GPBDataTypeBytes) {
|
| // Data stored as a length prefixed (network byte order) c-string in
|
| // descriptor structure.
|
| @@ -480,24 +433,6 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| }
|
| }
|
| }
|
| -
|
| - // FieldOptions stored as a length prefixed (network byte order) c-escaped
|
| - // string in descriptor records.
|
| - if (description->fieldOptions) {
|
| - uint8_t *optionsBytes = (uint8_t *)description->fieldOptions;
|
| - uint32_t optionsLength = *((uint32_t *)optionsBytes);
|
| - optionsLength = ntohl(optionsLength);
|
| - if (optionsLength > 0) {
|
| - optionsBytes += sizeof(optionsLength);
|
| - NSData *optionsData = [NSData dataWithBytesNoCopy:optionsBytes
|
| - length:optionsLength
|
| - freeWhenDone:NO];
|
| - GPBExtensionRegistry *registry = [rootClass extensionRegistry];
|
| - fieldOptions_ = [[GPBFieldOptions parseFromData:optionsData
|
| - extensionRegistry:registry
|
| - error:NULL] retain];
|
| - }
|
| - }
|
| }
|
| return self;
|
| }
|
| @@ -666,7 +601,7 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| } else {
|
| // Undo the CamelCase.
|
| NSMutableString *result = [NSMutableString stringWithCapacity:len];
|
| - for (NSUInteger i = 0; i < len; i++) {
|
| + for (uint32_t i = 0; i < len; i++) {
|
| unichar c = [name characterAtIndex:i];
|
| if (c >= 'A' && c <= 'Z') {
|
| if (i > 0) {
|
| @@ -686,10 +621,16 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
|
|
| @implementation GPBEnumDescriptor {
|
| NSString *name_;
|
| - GPBMessageEnumValueDescription *valueDescriptions_;
|
| - NSUInteger valueDescriptionsCount_;
|
| + // valueNames_ is a single c string with all of the value names appended
|
| + // together, each null terminated. -calcValueNameOffsets fills in
|
| + // nameOffsets_ with the offsets to allow quicker access to the individual
|
| + // names.
|
| + const char *valueNames_;
|
| + const int32_t *values_;
|
| GPBEnumValidationFunc enumVerifier_;
|
| const uint8_t *extraTextFormatInfo_;
|
| + uint32_t *nameOffsets_;
|
| + uint32_t valueCount_;
|
| }
|
|
|
| @synthesize name = name_;
|
| @@ -697,26 +638,30 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
|
|
| + (instancetype)
|
| allocDescriptorForName:(NSString *)name
|
| - values:(GPBMessageEnumValueDescription *)valueDescriptions
|
| - valueCount:(NSUInteger)valueCount
|
| + valueNames:(const char *)valueNames
|
| + values:(const int32_t *)values
|
| + count:(uint32_t)valueCount
|
| enumVerifier:(GPBEnumValidationFunc)enumVerifier {
|
| GPBEnumDescriptor *descriptor = [[self alloc] initWithName:name
|
| - values:valueDescriptions
|
| - valueCount:valueCount
|
| + valueNames:valueNames
|
| + values:values
|
| + count:valueCount
|
| enumVerifier:enumVerifier];
|
| return descriptor;
|
| }
|
|
|
| + (instancetype)
|
| allocDescriptorForName:(NSString *)name
|
| - values:(GPBMessageEnumValueDescription *)valueDescriptions
|
| - valueCount:(NSUInteger)valueCount
|
| + valueNames:(const char *)valueNames
|
| + values:(const int32_t *)values
|
| + count:(uint32_t)valueCount
|
| enumVerifier:(GPBEnumValidationFunc)enumVerifier
|
| extraTextFormatInfo:(const char *)extraTextFormatInfo {
|
| // Call the common case.
|
| GPBEnumDescriptor *descriptor = [self allocDescriptorForName:name
|
| - values:valueDescriptions
|
| - valueCount:valueCount
|
| + valueNames:valueNames
|
| + values:values
|
| + count:valueCount
|
| enumVerifier:enumVerifier];
|
| // Set the extra info.
|
| descriptor->extraTextFormatInfo_ = (const uint8_t *)extraTextFormatInfo;
|
| @@ -724,24 +669,49 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| }
|
|
|
| - (instancetype)initWithName:(NSString *)name
|
| - values:(GPBMessageEnumValueDescription *)valueDescriptions
|
| - valueCount:(NSUInteger)valueCount
|
| + valueNames:(const char *)valueNames
|
| + values:(const int32_t *)values
|
| + count:(uint32_t)valueCount
|
| enumVerifier:(GPBEnumValidationFunc)enumVerifier {
|
| if ((self = [super init])) {
|
| name_ = [name copy];
|
| - valueDescriptions_ = valueDescriptions;
|
| - valueDescriptionsCount_ = valueCount;
|
| + valueNames_ = valueNames;
|
| + values_ = values;
|
| + valueCount_ = valueCount;
|
| enumVerifier_ = enumVerifier;
|
| }
|
| return self;
|
| }
|
|
|
| +- (void)dealloc {
|
| + [name_ release];
|
| + if (nameOffsets_) free(nameOffsets_);
|
| + [super dealloc];
|
| +}
|
| +
|
| +- (void)calcValueNameOffsets {
|
| + @synchronized(self) {
|
| + if (nameOffsets_ != NULL) {
|
| + return;
|
| + }
|
| + uint32_t *offsets = malloc(valueCount_ * sizeof(uint32_t));
|
| + const char *scan = valueNames_;
|
| + for (uint32_t i = 0; i < valueCount_; ++i) {
|
| + offsets[i] = (uint32_t)(scan - valueNames_);
|
| + while (*scan != '\0') ++scan;
|
| + ++scan; // Step over the null.
|
| + }
|
| + nameOffsets_ = offsets;
|
| + }
|
| +}
|
| +
|
| - (NSString *)enumNameForValue:(int32_t)number {
|
| - for (NSUInteger i = 0; i < valueDescriptionsCount_; ++i) {
|
| - GPBMessageEnumValueDescription *scan = &valueDescriptions_[i];
|
| - if ((scan->number == number) && (scan->name != NULL)) {
|
| - NSString *fullName =
|
| - [NSString stringWithFormat:@"%@_%s", name_, scan->name];
|
| + if (nameOffsets_ == NULL) [self calcValueNameOffsets];
|
| +
|
| + for (uint32_t i = 0; i < valueCount_; ++i) {
|
| + if (values_[i] == number) {
|
| + const char *valueName = valueNames_ + nameOffsets_[i];
|
| + NSString *fullName = [NSString stringWithFormat:@"%@_%s", name_, valueName];
|
| return fullName;
|
| }
|
| }
|
| @@ -760,12 +730,14 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| const char *nameAsCStr = [name UTF8String];
|
| nameAsCStr += prefixLen;
|
|
|
| + if (nameOffsets_ == NULL) [self calcValueNameOffsets];
|
| +
|
| // Find it.
|
| - for (NSUInteger i = 0; i < valueDescriptionsCount_; ++i) {
|
| - GPBMessageEnumValueDescription *scan = &valueDescriptions_[i];
|
| - if ((scan->name != NULL) && (strcmp(nameAsCStr, scan->name) == 0)) {
|
| + for (uint32_t i = 0; i < valueCount_; ++i) {
|
| + const char *valueName = valueNames_ + nameOffsets_[i];
|
| + if (strcmp(nameAsCStr, valueName) == 0) {
|
| if (outValue) {
|
| - *outValue = scan->number;
|
| + *outValue = values_[i];
|
| }
|
| return YES;
|
| }
|
| @@ -773,34 +745,28 @@ uint32_t GPBFieldAlternateTag(GPBFieldDescriptor *self) {
|
| return NO;
|
| }
|
|
|
| -- (void)dealloc {
|
| - [name_ release];
|
| - [super dealloc];
|
| -}
|
| -
|
| - (NSString *)textFormatNameForValue:(int32_t)number {
|
| + if (nameOffsets_ == NULL) [self calcValueNameOffsets];
|
| +
|
| // Find the EnumValue descriptor and its index.
|
| - GPBMessageEnumValueDescription *valueDescriptor = NULL;
|
| - NSUInteger valueDescriptorIndex;
|
| - for (valueDescriptorIndex = 0; valueDescriptorIndex < valueDescriptionsCount_;
|
| + BOOL foundIt = NO;
|
| + uint32_t valueDescriptorIndex;
|
| + for (valueDescriptorIndex = 0; valueDescriptorIndex < valueCount_;
|
| ++valueDescriptorIndex) {
|
| - GPBMessageEnumValueDescription *scan =
|
| - &valueDescriptions_[valueDescriptorIndex];
|
| - if (scan->number == number) {
|
| - valueDescriptor = scan;
|
| + if (values_[valueDescriptorIndex] == number) {
|
| + foundIt = YES;
|
| break;
|
| }
|
| }
|
|
|
| - // If we didn't find it, or names were disable at proto compile time, nothing
|
| - // we can do.
|
| - if (!valueDescriptor || !valueDescriptor->name) {
|
| + if (!foundIt) {
|
| return nil;
|
| }
|
|
|
| NSString *result = nil;
|
| // Naming adds an underscore between enum name and value name, skip that also.
|
| - NSString *shortName = @(valueDescriptor->name);
|
| + const char *valueName = valueNames_ + nameOffsets_[valueDescriptorIndex];
|
| + NSString *shortName = @(valueName);
|
|
|
| // See if it is in the map of special format handling.
|
| if (extraTextFormatInfo_) {
|
|
|