diff options
Diffstat (limited to 'objectivec/GPBUnknownFieldSet.m')
-rw-r--r-- | objectivec/GPBUnknownFieldSet.m | 54 |
1 files changed, 13 insertions, 41 deletions
diff --git a/objectivec/GPBUnknownFieldSet.m b/objectivec/GPBUnknownFieldSet.m index 4ddc0d2a..a7335f05 100644 --- a/objectivec/GPBUnknownFieldSet.m +++ b/objectivec/GPBUnknownFieldSet.m @@ -36,39 +36,6 @@ #import "GPBUtilities.h" #import "GPBWireFormat.h" -#pragma mark CFDictionaryKeyCallBacks - -// We use a custom dictionary here because our keys are numbers and -// conversion back and forth from NSNumber was costing us performance. -// If/when we move to C++ this could be done using a std::map and some -// careful retain/release calls. - -static const void *GPBUnknownFieldSetKeyRetain(CFAllocatorRef allocator, - const void *value) { -#pragma unused(allocator) - return value; -} - -static void GPBUnknownFieldSetKeyRelease(CFAllocatorRef allocator, - const void *value) { -#pragma unused(allocator) -#pragma unused(value) -} - -static CFStringRef GPBUnknownFieldSetCopyKeyDescription(const void *value) { - return CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%d"), - (int)value); -} - -static Boolean GPBUnknownFieldSetKeyEqual(const void *value1, - const void *value2) { - return value1 == value2; -} - -static CFHashCode GPBUnknownFieldSetKeyHash(const void *value) { - return (CFHashCode)value; -} - #pragma mark Helpers static void checkNumber(int32_t number) { @@ -93,6 +60,12 @@ static void CopyWorker(const void *key, const void *value, void *context) { [copied release]; } +// Direct access is use for speed, to avoid even internally declaring things +// read/write, etc. The warning is enabled in the project to ensure code calling +// protos can turn on -Wdirect-ivar-access without issues. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdirect-ivar-access" + - (id)copyWithZone:(NSZone *)zone { GPBUnknownFieldSet *result = [[GPBUnknownFieldSet allocWithZone:zone] init]; if (fields_) { @@ -148,7 +121,7 @@ static void CopyWorker(const void *key, const void *value, void *context) { } - (NSArray *)sortedFields { - if (!fields_) return nil; + if (!fields_) return [NSArray array]; size_t count = CFDictionaryGetCount(fields_); ssize_t keys[count]; GPBUnknownField *values[count]; @@ -285,13 +258,9 @@ static void GPBUnknownFieldSetSerializedSizeAsMessageSet(const void *key, int32_t number = [field number]; checkNumber(number); if (!fields_) { - CFDictionaryKeyCallBacks keyCallBacks = { - // See description above for reason for using custom dictionary. - 0, GPBUnknownFieldSetKeyRetain, GPBUnknownFieldSetKeyRelease, - GPBUnknownFieldSetCopyKeyDescription, GPBUnknownFieldSetKeyEqual, - GPBUnknownFieldSetKeyHash, - }; - fields_ = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &keyCallBacks, + // Use a custom dictionary here because the keys are numbers and conversion + // back and forth from NSNumber isn't worth the cost. + fields_ = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks); } ssize_t key = number; @@ -353,6 +322,7 @@ static void GPBUnknownFieldSetMergeUnknownFields(const void *key, } - (BOOL)mergeFieldFrom:(int32_t)tag input:(GPBCodedInputStream *)input { + NSAssert(GPBWireFormatIsValidTag(tag), @"Got passed an invalid tag"); int32_t number = GPBWireFormatGetTagFieldNumber(tag); GPBCodedInputStreamState *state = &input->state_; switch (GPBWireFormatGetTagWireType(tag)) { @@ -420,4 +390,6 @@ static void GPBUnknownFieldSetMergeUnknownFields(const void *key, } } +#pragma clang diagnostic pop + @end |