Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Side by Side Diff: third_party/protobuf/objectivec/GPBMessage.m

Issue 2599263002: third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Address comments Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 26 matching lines...) Expand all
37 #import "GPBCodedInputStream_PackagePrivate.h" 37 #import "GPBCodedInputStream_PackagePrivate.h"
38 #import "GPBCodedOutputStream_PackagePrivate.h" 38 #import "GPBCodedOutputStream_PackagePrivate.h"
39 #import "GPBDescriptor_PackagePrivate.h" 39 #import "GPBDescriptor_PackagePrivate.h"
40 #import "GPBDictionary_PackagePrivate.h" 40 #import "GPBDictionary_PackagePrivate.h"
41 #import "GPBExtensionInternals.h" 41 #import "GPBExtensionInternals.h"
42 #import "GPBExtensionRegistry.h" 42 #import "GPBExtensionRegistry.h"
43 #import "GPBRootObject_PackagePrivate.h" 43 #import "GPBRootObject_PackagePrivate.h"
44 #import "GPBUnknownFieldSet_PackagePrivate.h" 44 #import "GPBUnknownFieldSet_PackagePrivate.h"
45 #import "GPBUtilities_PackagePrivate.h" 45 #import "GPBUtilities_PackagePrivate.h"
46 46
47 // Direct access is use for speed, to avoid even internally declaring things
48 // read/write, etc. The warning is enabled in the project to ensure code calling
49 // protos can turn on -Wdirect-ivar-access without issues.
50 #pragma clang diagnostic push
51 #pragma clang diagnostic ignored "-Wdirect-ivar-access"
52
47 NSString *const GPBMessageErrorDomain = 53 NSString *const GPBMessageErrorDomain =
48 GPBNSStringifySymbol(GPBMessageErrorDomain); 54 GPBNSStringifySymbol(GPBMessageErrorDomain);
49 55
50 #ifdef DEBUG 56 NSString *const GPBErrorReasonKey = @"Reason";
51 NSString *const GPBExceptionMessageKey =
52 GPBNSStringifySymbol(GPBExceptionMessage);
53 #endif // DEBUG
54 57
55 static NSString *const kGPBDataCoderKey = @"GPBData"; 58 static NSString *const kGPBDataCoderKey = @"GPBData";
56 59
57 // 60 //
58 // PLEASE REMEMBER: 61 // PLEASE REMEMBER:
59 // 62 //
60 // This is the base class for *all* messages generated, so any selector defined, 63 // This is the base class for *all* messages generated, so any selector defined,
61 // *public* or *private* could end up colliding with a proto message field. So 64 // *public* or *private* could end up colliding with a proto message field. So
62 // avoid using selectors that could match a property, use C functions to hide 65 // avoid using selectors that could match a property, use C functions to hide
63 // them, etc. 66 // them, etc.
(...skipping 24 matching lines...) Expand all
88 GPBMessage *autocreator) 91 GPBMessage *autocreator)
89 __attribute__((ns_returns_retained)); 92 __attribute__((ns_returns_retained));
90 static id GetOrCreateMapIvarWithField(GPBMessage *self, 93 static id GetOrCreateMapIvarWithField(GPBMessage *self,
91 GPBFieldDescriptor *field, 94 GPBFieldDescriptor *field,
92 GPBFileSyntax syntax); 95 GPBFileSyntax syntax);
93 static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field); 96 static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
94 static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap, 97 static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap,
95 NSZone *zone) 98 NSZone *zone)
96 __attribute__((ns_returns_retained)); 99 __attribute__((ns_returns_retained));
97 100
101 #ifdef DEBUG
98 static NSError *MessageError(NSInteger code, NSDictionary *userInfo) { 102 static NSError *MessageError(NSInteger code, NSDictionary *userInfo) {
99 return [NSError errorWithDomain:GPBMessageErrorDomain 103 return [NSError errorWithDomain:GPBMessageErrorDomain
100 code:code 104 code:code
101 userInfo:userInfo]; 105 userInfo:userInfo];
102 } 106 }
107 #endif
103 108
104 static NSError *MessageErrorWithReason(NSInteger code, NSString *reason) { 109 static NSError *ErrorFromException(NSException *exception) {
105 NSDictionary *userInfo = nil; 110 NSError *error = nil;
106 if ([reason length]) { 111
107 userInfo = @{ @"Reason" : reason }; 112 if ([exception.name isEqual:GPBCodedInputStreamException]) {
113 NSDictionary *exceptionInfo = exception.userInfo;
114 error = exceptionInfo[GPBCodedInputStreamUnderlyingErrorKey];
108 } 115 }
109 return MessageError(code, userInfo); 116
117 if (!error) {
118 NSString *reason = exception.reason;
119 NSDictionary *userInfo = nil;
120 if ([reason length]) {
121 userInfo = @{ GPBErrorReasonKey : reason };
122 }
123
124 error = [NSError errorWithDomain:GPBMessageErrorDomain
125 code:GPBMessageErrorCodeOther
126 userInfo:userInfo];
127 }
128 return error;
110 } 129 }
111 130
112
113 static void CheckExtension(GPBMessage *self, 131 static void CheckExtension(GPBMessage *self,
114 GPBExtensionDescriptor *extension) { 132 GPBExtensionDescriptor *extension) {
115 if ([self class] != extension.containingMessageClass) { 133 if ([self class] != extension.containingMessageClass) {
116 [NSException 134 [NSException
117 raise:NSInvalidArgumentException 135 raise:NSInvalidArgumentException
118 format:@"Extension %@ used on wrong class (%@ instead of %@)", 136 format:@"Extension %@ used on wrong class (%@ instead of %@)",
119 extension.singletonName, 137 extension.singletonName,
120 [self class], extension.containingMessageClass]; 138 [self class], extension.containingMessageClass];
121 } 139 }
122 } 140 }
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 } 705 }
688 } 706 }
689 NSCAssert(NO, @"Unknown autocreated %@ for %@.", [dictionary class], self); 707 NSCAssert(NO, @"Unknown autocreated %@ for %@.", [dictionary class], self);
690 } 708 }
691 709
692 void GPBClearMessageAutocreator(GPBMessage *self) { 710 void GPBClearMessageAutocreator(GPBMessage *self) {
693 if ((self == nil) || !self->autocreator_) { 711 if ((self == nil) || !self->autocreator_) {
694 return; 712 return;
695 } 713 }
696 714
697 #if DEBUG && !defined(NS_BLOCK_ASSERTIONS) 715 #if defined(DEBUG) && DEBUG && !defined(NS_BLOCK_ASSERTIONS)
698 // Either the autocreator must have its "has" flag set to YES, or it must be 716 // Either the autocreator must have its "has" flag set to YES, or it must be
699 // NO and not equal to ourselves. 717 // NO and not equal to ourselves.
700 BOOL autocreatorHas = 718 BOOL autocreatorHas =
701 (self->autocreatorField_ 719 (self->autocreatorField_
702 ? GPBGetHasIvarField(self->autocreator_, self->autocreatorField_) 720 ? GPBGetHasIvarField(self->autocreator_, self->autocreatorField_)
703 : [self->autocreator_ hasExtension:self->autocreatorExtension_]); 721 : [self->autocreator_ hasExtension:self->autocreatorExtension_]);
704 GPBMessage *autocreatorFieldValue = 722 GPBMessage *autocreatorFieldValue =
705 (self->autocreatorField_ 723 (self->autocreatorField_
706 ? GPBGetObjectIvarWithFieldNoAutocreate(self->autocreator_, 724 ? GPBGetObjectIvarWithFieldNoAutocreate(self->autocreator_,
707 self->autocreatorField_) 725 self->autocreatorField_)
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 @try { 827 @try {
810 [self mergeFromData:data extensionRegistry:extensionRegistry]; 828 [self mergeFromData:data extensionRegistry:extensionRegistry];
811 if (errorPtr) { 829 if (errorPtr) {
812 *errorPtr = nil; 830 *errorPtr = nil;
813 } 831 }
814 } 832 }
815 @catch (NSException *exception) { 833 @catch (NSException *exception) {
816 [self release]; 834 [self release];
817 self = nil; 835 self = nil;
818 if (errorPtr) { 836 if (errorPtr) {
819 *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, 837 *errorPtr = ErrorFromException(exception);
820 exception.reason);
821 } 838 }
822 } 839 }
823 #ifdef DEBUG 840 #ifdef DEBUG
824 if (self && !self.initialized) { 841 if (self && !self.initialized) {
825 [self release]; 842 [self release];
826 self = nil; 843 self = nil;
827 if (errorPtr) { 844 if (errorPtr) {
828 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil); 845 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil);
829 } 846 }
830 } 847 }
(...skipping 10 matching lines...) Expand all
841 @try { 858 @try {
842 [self mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] ; 859 [self mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] ;
843 if (errorPtr) { 860 if (errorPtr) {
844 *errorPtr = nil; 861 *errorPtr = nil;
845 } 862 }
846 } 863 }
847 @catch (NSException *exception) { 864 @catch (NSException *exception) {
848 [self release]; 865 [self release];
849 self = nil; 866 self = nil;
850 if (errorPtr) { 867 if (errorPtr) {
851 *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, 868 *errorPtr = ErrorFromException(exception);
852 exception.reason);
853 } 869 }
854 } 870 }
855 #ifdef DEBUG 871 #ifdef DEBUG
856 if (self && !self.initialized) { 872 if (self && !self.initialized) {
857 [self release]; 873 [self release];
858 self = nil; 874 self = nil;
859 if (errorPtr) { 875 if (errorPtr) {
860 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil); 876 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil);
861 } 877 }
862 } 878 }
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
1729 dispatch_semaphore_signal(readOnlySemaphore_); 1745 dispatch_semaphore_signal(readOnlySemaphore_);
1730 return value; 1746 return value;
1731 } 1747 }
1732 1748
1733 - (id)getExistingExtension:(GPBExtensionDescriptor *)extension { 1749 - (id)getExistingExtension:(GPBExtensionDescriptor *)extension {
1734 // This is an internal method so we don't need to call CheckExtension(). 1750 // This is an internal method so we don't need to call CheckExtension().
1735 return [extensionMap_ objectForKey:extension]; 1751 return [extensionMap_ objectForKey:extension];
1736 } 1752 }
1737 1753
1738 - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension { 1754 - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension {
1739 #if DEBUG 1755 #if defined(DEBUG) && DEBUG
1740 CheckExtension(self, extension); 1756 CheckExtension(self, extension);
1741 #endif // DEBUG 1757 #endif // DEBUG
1742 return nil != [extensionMap_ objectForKey:extension]; 1758 return nil != [extensionMap_ objectForKey:extension];
1743 } 1759 }
1744 1760
1745 - (NSArray *)extensionsCurrentlySet { 1761 - (NSArray *)extensionsCurrentlySet {
1746 return [extensionMap_ allKeys]; 1762 return [extensionMap_ allKeys];
1747 } 1763 }
1748 1764
1749 - (void)writeExtensionsToCodedOutputStream:(GPBCodedOutputStream *)output 1765 - (void)writeExtensionsToCodedOutputStream:(GPBCodedOutputStream *)output
1750 range:(GPBExtensionRange)range { 1766 range:(GPBExtensionRange)range {
1751 NSArray *sortedExtensions = [[extensionMap_ allKeys] 1767 NSArray *sortedExtensions = [[extensionMap_ allKeys]
1752 sortedArrayUsingSelector:@selector(compareByFieldNumber:)]; 1768 sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
1753 uint32_t start = range.start; 1769 uint32_t start = range.start;
1754 uint32_t end = range.end; 1770 uint32_t end = range.end;
1755 for (GPBExtensionDescriptor *extension in sortedExtensions) { 1771 for (GPBExtensionDescriptor *extension in sortedExtensions) {
1756 uint32_t fieldNumber = extension.fieldNumber; 1772 uint32_t fieldNumber = extension.fieldNumber;
1757 if (fieldNumber >= start && fieldNumber < end) { 1773 if (fieldNumber >= start && fieldNumber < end) {
1758 id value = [extensionMap_ objectForKey:extension]; 1774 id value = [extensionMap_ objectForKey:extension];
1759 GPBWriteExtensionValueToOutputStream(extension, value, output); 1775 GPBWriteExtensionValueToOutputStream(extension, value, output);
1760 } 1776 }
1761 } 1777 }
1762 } 1778 }
1763 1779
1764 - (NSArray *)sortedExtensionsInUse {
1765 return [[extensionMap_ allKeys]
1766 sortedArrayUsingSelector:@selector(compareByFieldNumber:)];
1767 }
1768
1769 - (void)setExtension:(GPBExtensionDescriptor *)extension value:(id)value { 1780 - (void)setExtension:(GPBExtensionDescriptor *)extension value:(id)value {
1770 if (!value) { 1781 if (!value) {
1771 [self clearExtension:extension]; 1782 [self clearExtension:extension];
1772 return; 1783 return;
1773 } 1784 }
1774 1785
1775 CheckExtension(self, extension); 1786 CheckExtension(self, extension);
1776 1787
1777 if (extension.repeated) { 1788 if (extension.repeated) {
1778 [NSException raise:NSInvalidArgumentException 1789 [NSException raise:NSInvalidArgumentException
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 @try { 1926 @try {
1916 [message mergeDelimitedFromCodedInputStream:input 1927 [message mergeDelimitedFromCodedInputStream:input
1917 extensionRegistry:extensionRegistry]; 1928 extensionRegistry:extensionRegistry];
1918 if (errorPtr) { 1929 if (errorPtr) {
1919 *errorPtr = nil; 1930 *errorPtr = nil;
1920 } 1931 }
1921 } 1932 }
1922 @catch (NSException *exception) { 1933 @catch (NSException *exception) {
1923 message = nil; 1934 message = nil;
1924 if (errorPtr) { 1935 if (errorPtr) {
1925 *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, 1936 *errorPtr = ErrorFromException(exception);
1926 exception.reason);
1927 } 1937 }
1928 } 1938 }
1929 #ifdef DEBUG 1939 #ifdef DEBUG
1930 if (message && !message.initialized) { 1940 if (message && !message.initialized) {
1931 message = nil; 1941 message = nil;
1932 if (errorPtr) { 1942 if (errorPtr) {
1933 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil); 1943 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil);
1934 } 1944 }
1935 } 1945 }
1936 #endif 1946 #endif
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
2257 GPBDescriptor *descriptor = [self descriptor]; 2267 GPBDescriptor *descriptor = [self descriptor];
2258 GPBFileSyntax syntax = descriptor.file.syntax; 2268 GPBFileSyntax syntax = descriptor.file.syntax;
2259 GPBCodedInputStreamState *state = &input->state_; 2269 GPBCodedInputStreamState *state = &input->state_;
2260 uint32_t tag = 0; 2270 uint32_t tag = 0;
2261 NSUInteger startingIndex = 0; 2271 NSUInteger startingIndex = 0;
2262 NSArray *fields = descriptor->fields_; 2272 NSArray *fields = descriptor->fields_;
2263 NSUInteger numFields = fields.count; 2273 NSUInteger numFields = fields.count;
2264 while (YES) { 2274 while (YES) {
2265 BOOL merged = NO; 2275 BOOL merged = NO;
2266 tag = GPBCodedInputStreamReadTag(state); 2276 tag = GPBCodedInputStreamReadTag(state);
2277 if (tag == 0) {
2278 break; // Reached end.
2279 }
2267 for (NSUInteger i = 0; i < numFields; ++i) { 2280 for (NSUInteger i = 0; i < numFields; ++i) {
2268 if (startingIndex >= numFields) startingIndex = 0; 2281 if (startingIndex >= numFields) startingIndex = 0;
2269 GPBFieldDescriptor *fieldDescriptor = fields[startingIndex]; 2282 GPBFieldDescriptor *fieldDescriptor = fields[startingIndex];
2270 if (GPBFieldTag(fieldDescriptor) == tag) { 2283 if (GPBFieldTag(fieldDescriptor) == tag) {
2271 GPBFieldType fieldType = fieldDescriptor.fieldType; 2284 GPBFieldType fieldType = fieldDescriptor.fieldType;
2272 if (fieldType == GPBFieldTypeSingle) { 2285 if (fieldType == GPBFieldTypeSingle) {
2273 MergeSingleFieldFromCodedInputStream(self, fieldDescriptor, syntax, 2286 MergeSingleFieldFromCodedInputStream(self, fieldDescriptor, syntax,
2274 input, extensionRegistry); 2287 input, extensionRegistry);
2275 // Well formed protos will only have a single field once, advance 2288 // Well formed protos will only have a single field once, advance
2276 // the starting index to the next field. 2289 // the starting index to the next field.
(...skipping 18 matching lines...) Expand all
2295 field:fieldDescriptor 2308 field:fieldDescriptor
2296 parentMessage:self]; 2309 parentMessage:self];
2297 } 2310 }
2298 merged = YES; 2311 merged = YES;
2299 break; 2312 break;
2300 } else { 2313 } else {
2301 startingIndex += 1; 2314 startingIndex += 1;
2302 } 2315 }
2303 } // for(i < numFields) 2316 } // for(i < numFields)
2304 2317
2305 if (!merged) { 2318 if (!merged && (tag != 0)) {
2306 // Primitive, repeated types can be packed on unpacked on the wire, and 2319 // Primitive, repeated types can be packed on unpacked on the wire, and
2307 // are parsed either way. The above loop covered tag in the preferred 2320 // are parsed either way. The above loop covered tag in the preferred
2308 // for, so this need to check the alternate form. 2321 // for, so this need to check the alternate form.
2309 for (NSUInteger i = 0; i < numFields; ++i) { 2322 for (NSUInteger i = 0; i < numFields; ++i) {
2310 if (startingIndex >= numFields) startingIndex = 0; 2323 if (startingIndex >= numFields) startingIndex = 0;
2311 GPBFieldDescriptor *fieldDescriptor = fields[startingIndex]; 2324 GPBFieldDescriptor *fieldDescriptor = fields[startingIndex];
2312 if ((fieldDescriptor.fieldType == GPBFieldTypeRepeated) && 2325 if ((fieldDescriptor.fieldType == GPBFieldTypeRepeated) &&
2313 !GPBFieldDataTypeIsObject(fieldDescriptor) && 2326 !GPBFieldDataTypeIsObject(fieldDescriptor) &&
2314 (GPBFieldAlternateTag(fieldDescriptor) == tag)) { 2327 (GPBFieldAlternateTag(fieldDescriptor) == tag)) {
2315 BOOL alternateIsPacked = !fieldDescriptor.isPackable; 2328 BOOL alternateIsPacked = !fieldDescriptor.isPackable;
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 [autocreatedExtensionMap_ removeObjectForKey:extension]; 2563 [autocreatedExtensionMap_ removeObjectForKey:extension];
2551 GPBClearMessageAutocreator(autocreatedValue); 2564 GPBClearMessageAutocreator(autocreatedValue);
2552 [autocreatedValue release]; 2565 [autocreatedValue release];
2553 } 2566 }
2554 } 2567 }
2555 } 2568 }
2556 } 2569 }
2557 2570
2558 #pragma mark - isEqual: & hash Support 2571 #pragma mark - isEqual: & hash Support
2559 2572
2560 - (BOOL)isEqual:(GPBMessage *)other { 2573 - (BOOL)isEqual:(id)other {
2561 if (other == self) { 2574 if (other == self) {
2562 return YES; 2575 return YES;
2563 } 2576 }
2564 if (![other isKindOfClass:[self class]] && 2577 if (![other isKindOfClass:[self class]] &&
2565 ![self isKindOfClass:[other class]]) { 2578 ![self isKindOfClass:[other class]]) {
2566 return NO; 2579 return NO;
2567 } 2580 }
2568 2581
2582 GPBMessage *otherMsg = other;
2569 GPBDescriptor *descriptor = [[self class] descriptor]; 2583 GPBDescriptor *descriptor = [[self class] descriptor];
2570 uint8_t *selfStorage = (uint8_t *)messageStorage_; 2584 uint8_t *selfStorage = (uint8_t *)messageStorage_;
2571 uint8_t *otherStorage = (uint8_t *)other->messageStorage_; 2585 uint8_t *otherStorage = (uint8_t *)otherMsg->messageStorage_;
2572 2586
2573 for (GPBFieldDescriptor *field in descriptor->fields_) { 2587 for (GPBFieldDescriptor *field in descriptor->fields_) {
2574 if (GPBFieldIsMapOrArray(field)) { 2588 if (GPBFieldIsMapOrArray(field)) {
2575 // In the case of a list or map, there is no _hasIvar to worry about. 2589 // In the case of a list or map, there is no _hasIvar to worry about.
2576 // NOTE: These are NSArray/GPB*Array or NSDictionary/GPB*Dictionary, but 2590 // NOTE: These are NSArray/GPB*Array or NSDictionary/GPB*Dictionary, but
2577 // the type doesn't really matter as the objects all support -count and 2591 // the type doesn't really matter as the objects all support -count and
2578 // -isEqual:. 2592 // -isEqual:.
2579 NSArray *resultMapOrArray = 2593 NSArray *resultMapOrArray =
2580 GPBGetObjectIvarWithFieldNoAutocreate(self, field); 2594 GPBGetObjectIvarWithFieldNoAutocreate(self, field);
2581 NSArray *otherMapOrArray = 2595 NSArray *otherMapOrArray =
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2614 } 2628 }
2615 break; 2629 break;
2616 } 2630 }
2617 case GPBDataTypeSFixed32: 2631 case GPBDataTypeSFixed32:
2618 case GPBDataTypeInt32: 2632 case GPBDataTypeInt32:
2619 case GPBDataTypeSInt32: 2633 case GPBDataTypeSInt32:
2620 case GPBDataTypeEnum: 2634 case GPBDataTypeEnum:
2621 case GPBDataTypeFixed32: 2635 case GPBDataTypeFixed32:
2622 case GPBDataTypeUInt32: 2636 case GPBDataTypeUInt32:
2623 case GPBDataTypeFloat: { 2637 case GPBDataTypeFloat: {
2624 _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits ); 2638 GPBInternalCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_ 32_bits);
2625 // These are all 32bit, signed/unsigned doesn't matter for equality. 2639 // These are all 32bit, signed/unsigned doesn't matter for equality.
2626 uint32_t *selfValPtr = (uint32_t *)&selfStorage[fieldOffset]; 2640 uint32_t *selfValPtr = (uint32_t *)&selfStorage[fieldOffset];
2627 uint32_t *otherValPtr = (uint32_t *)&otherStorage[fieldOffset]; 2641 uint32_t *otherValPtr = (uint32_t *)&otherStorage[fieldOffset];
2628 if (*selfValPtr != *otherValPtr) { 2642 if (*selfValPtr != *otherValPtr) {
2629 return NO; 2643 return NO;
2630 } 2644 }
2631 break; 2645 break;
2632 } 2646 }
2633 case GPBDataTypeSFixed64: 2647 case GPBDataTypeSFixed64:
2634 case GPBDataTypeInt64: 2648 case GPBDataTypeInt64:
2635 case GPBDataTypeSInt64: 2649 case GPBDataTypeSInt64:
2636 case GPBDataTypeFixed64: 2650 case GPBDataTypeFixed64:
2637 case GPBDataTypeUInt64: 2651 case GPBDataTypeUInt64:
2638 case GPBDataTypeDouble: { 2652 case GPBDataTypeDouble: {
2639 _GPBCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bi ts); 2653 GPBInternalCompileAssert(sizeof(double) == sizeof(uint64_t), double_no t_64_bits);
2640 // These are all 64bit, signed/unsigned doesn't matter for equality. 2654 // These are all 64bit, signed/unsigned doesn't matter for equality.
2641 uint64_t *selfValPtr = (uint64_t *)&selfStorage[fieldOffset]; 2655 uint64_t *selfValPtr = (uint64_t *)&selfStorage[fieldOffset];
2642 uint64_t *otherValPtr = (uint64_t *)&otherStorage[fieldOffset]; 2656 uint64_t *otherValPtr = (uint64_t *)&otherStorage[fieldOffset];
2643 if (*selfValPtr != *otherValPtr) { 2657 if (*selfValPtr != *otherValPtr) {
2644 return NO; 2658 return NO;
2645 } 2659 }
2646 break; 2660 break;
2647 } 2661 }
2648 case GPBDataTypeBytes: 2662 case GPBDataTypeBytes:
2649 case GPBDataTypeString: 2663 case GPBDataTypeString:
2650 case GPBDataTypeMessage: 2664 case GPBDataTypeMessage:
2651 case GPBDataTypeGroup: { 2665 case GPBDataTypeGroup: {
2652 // Type doesn't matter here, they all implement -isEqual:. 2666 // Type doesn't matter here, they all implement -isEqual:.
2653 id *selfValPtr = (id *)&selfStorage[fieldOffset]; 2667 id *selfValPtr = (id *)&selfStorage[fieldOffset];
2654 id *otherValPtr = (id *)&otherStorage[fieldOffset]; 2668 id *otherValPtr = (id *)&otherStorage[fieldOffset];
2655 if (![*selfValPtr isEqual:*otherValPtr]) { 2669 if (![*selfValPtr isEqual:*otherValPtr]) {
2656 return NO; 2670 return NO;
2657 } 2671 }
2658 break; 2672 break;
2659 } 2673 }
2660 } // switch() 2674 } // switch()
2661 } // if(mapOrArray)...else 2675 } // if(mapOrArray)...else
2662 } // for(fields) 2676 } // for(fields)
2663 2677
2664 // nil and empty are equal 2678 // nil and empty are equal
2665 if (extensionMap_.count != 0 || other->extensionMap_.count != 0) { 2679 if (extensionMap_.count != 0 || otherMsg->extensionMap_.count != 0) {
2666 if (![extensionMap_ isEqual:other->extensionMap_]) { 2680 if (![extensionMap_ isEqual:otherMsg->extensionMap_]) {
2667 return NO; 2681 return NO;
2668 } 2682 }
2669 } 2683 }
2670 2684
2671 // nil and empty are equal 2685 // nil and empty are equal
2672 GPBUnknownFieldSet *otherUnknowns = other->unknownFields_; 2686 GPBUnknownFieldSet *otherUnknowns = otherMsg->unknownFields_;
2673 if ([unknownFields_ countOfFields] != 0 || 2687 if ([unknownFields_ countOfFields] != 0 ||
2674 [otherUnknowns countOfFields] != 0) { 2688 [otherUnknowns countOfFields] != 0) {
2675 if (![unknownFields_ isEqual:otherUnknowns]) { 2689 if (![unknownFields_ isEqual:otherUnknowns]) {
2676 return NO; 2690 return NO;
2677 } 2691 }
2678 } 2692 }
2679 2693
2680 return YES; 2694 return YES;
2681 } 2695 }
2682 2696
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2726 result = prime * result + value; 2740 result = prime * result + value;
2727 break; 2741 break;
2728 } 2742 }
2729 case GPBDataTypeSFixed32: 2743 case GPBDataTypeSFixed32:
2730 case GPBDataTypeInt32: 2744 case GPBDataTypeInt32:
2731 case GPBDataTypeSInt32: 2745 case GPBDataTypeSInt32:
2732 case GPBDataTypeEnum: 2746 case GPBDataTypeEnum:
2733 case GPBDataTypeFixed32: 2747 case GPBDataTypeFixed32:
2734 case GPBDataTypeUInt32: 2748 case GPBDataTypeUInt32:
2735 case GPBDataTypeFloat: { 2749 case GPBDataTypeFloat: {
2736 _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits ); 2750 GPBInternalCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_ 32_bits);
2737 // These are all 32bit, just mix it in. 2751 // These are all 32bit, just mix it in.
2738 uint32_t *valPtr = (uint32_t *)&storage[fieldOffset]; 2752 uint32_t *valPtr = (uint32_t *)&storage[fieldOffset];
2739 result = prime * result + *valPtr; 2753 result = prime * result + *valPtr;
2740 break; 2754 break;
2741 } 2755 }
2742 case GPBDataTypeSFixed64: 2756 case GPBDataTypeSFixed64:
2743 case GPBDataTypeInt64: 2757 case GPBDataTypeInt64:
2744 case GPBDataTypeSInt64: 2758 case GPBDataTypeSInt64:
2745 case GPBDataTypeFixed64: 2759 case GPBDataTypeFixed64:
2746 case GPBDataTypeUInt64: 2760 case GPBDataTypeUInt64:
2747 case GPBDataTypeDouble: { 2761 case GPBDataTypeDouble: {
2748 _GPBCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bi ts); 2762 GPBInternalCompileAssert(sizeof(double) == sizeof(uint64_t), double_no t_64_bits);
2749 // These are all 64bit, just mix what fits into an NSUInteger in. 2763 // These are all 64bit, just mix what fits into an NSUInteger in.
2750 uint64_t *valPtr = (uint64_t *)&storage[fieldOffset]; 2764 uint64_t *valPtr = (uint64_t *)&storage[fieldOffset];
2751 result = prime * result + (NSUInteger)(*valPtr); 2765 result = prime * result + (NSUInteger)(*valPtr);
2752 break; 2766 break;
2753 } 2767 }
2754 case GPBDataTypeBytes: 2768 case GPBDataTypeBytes:
2755 case GPBDataTypeString: { 2769 case GPBDataTypeString: {
2756 // Type doesn't matter here, they both implement -hash:. 2770 // Type doesn't matter here, they both implement -hash:.
2757 id *valPtr = (id *)&storage[fieldOffset]; 2771 id *valPtr = (id *)&storage[fieldOffset];
2758 result = prime * result + [*valPtr hash]; 2772 result = prime * result + [*valPtr hash];
(...skipping 26 matching lines...) Expand all
2785 2799
2786 #pragma mark - Description Support 2800 #pragma mark - Description Support
2787 2801
2788 - (NSString *)description { 2802 - (NSString *)description {
2789 NSString *textFormat = GPBTextFormatForMessage(self, @" "); 2803 NSString *textFormat = GPBTextFormatForMessage(self, @" ");
2790 NSString *description = [NSString 2804 NSString *description = [NSString
2791 stringWithFormat:@"<%@ %p>: {\n%@}", [self class], self, textFormat]; 2805 stringWithFormat:@"<%@ %p>: {\n%@}", [self class], self, textFormat];
2792 return description; 2806 return description;
2793 } 2807 }
2794 2808
2795 #if DEBUG 2809 #if defined(DEBUG) && DEBUG
2796 2810
2797 // Xcode 5.1 added support for custom quick look info. 2811 // Xcode 5.1 added support for custom quick look info.
2798 // https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/CustomC lassDisplay_in_QuickLook/CH01-quick_look_for_custom_objects/CH01-quick_look_for_ custom_objects.html#//apple_ref/doc/uid/TP40014001-CH2-SW1 2812 // https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/CustomC lassDisplay_in_QuickLook/CH01-quick_look_for_custom_objects/CH01-quick_look_for_ custom_objects.html#//apple_ref/doc/uid/TP40014001-CH2-SW1
2799 - (id)debugQuickLookObject { 2813 - (id)debugQuickLookObject {
2800 return GPBTextFormatForMessage(self, nil); 2814 return GPBTextFormatForMessage(self, nil);
2801 } 2815 }
2802 2816
2803 #endif // DEBUG 2817 #endif // DEBUG
2804 2818
2805 #pragma mark - SerializedSize 2819 #pragma mark - SerializedSize
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 } 3189 }
3176 3190
3177 #pragma mark - KVC Support 3191 #pragma mark - KVC Support
3178 3192
3179 + (BOOL)accessInstanceVariablesDirectly { 3193 + (BOOL)accessInstanceVariablesDirectly {
3180 // Make sure KVC doesn't use instance variables. 3194 // Make sure KVC doesn't use instance variables.
3181 return NO; 3195 return NO;
3182 } 3196 }
3183 3197
3184 @end 3198 @end
3199
3200 #pragma mark - Messages from GPBUtilities.h but defined here for access to helpe rs.
3201
3202 // Only exists for public api, no core code should use this.
3203 id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field) {
3204 #if defined(DEBUG) && DEBUG
3205 if (field.fieldType != GPBFieldTypeRepeated) {
3206 [NSException raise:NSInvalidArgumentException
3207 format:@"%@.%@ is not a repeated field.",
3208 [self class], field.name];
3209 }
3210 #endif
3211 GPBDescriptor *descriptor = [[self class] descriptor];
3212 GPBFileSyntax syntax = descriptor.file.syntax;
3213 return GetOrCreateArrayIvarWithField(self, field, syntax);
3214 }
3215
3216 // Only exists for public api, no core code should use this.
3217 id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field) {
3218 #if defined(DEBUG) && DEBUG
3219 if (field.fieldType != GPBFieldTypeMap) {
3220 [NSException raise:NSInvalidArgumentException
3221 format:@"%@.%@ is not a map<> field.",
3222 [self class], field.name];
3223 }
3224 #endif
3225 GPBDescriptor *descriptor = [[self class] descriptor];
3226 GPBFileSyntax syntax = descriptor.file.syntax;
3227 return GetOrCreateMapIvarWithField(self, field, syntax);
3228 }
3229
3230 #pragma clang diagnostic pop
OLDNEW
« no previous file with comments | « third_party/protobuf/objectivec/GPBMessage.h ('k') | third_party/protobuf/objectivec/GPBMessage_PackagePrivate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698