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

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

Issue 1983203003: Update third_party/protobuf to protobuf-v3.0.0-beta-3 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: owners Created 4 years, 6 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 17 matching lines...) Expand all
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 30
31 #import "GPBMessage_PackagePrivate.h" 31 #import "GPBMessage_PackagePrivate.h"
32 32
33 #import <objc/runtime.h> 33 #import <objc/runtime.h>
34 #import <objc/message.h> 34 #import <objc/message.h>
35 35
36 #import "GPBArray_PackagePrivate.h" 36 #import "GPBArray_PackagePrivate.h"
37 #import "GPBCodedInputStream_PackagePrivate.h" 37 #import "GPBCodedInputStream_PackagePrivate.h"
38 #import "GPBCodedOutputStream.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 NSString *const GPBMessageErrorDomain = 47 NSString *const GPBMessageErrorDomain =
48 GPBNSStringifySymbol(GPBMessageErrorDomain); 48 GPBNSStringifySymbol(GPBMessageErrorDomain);
49 49
50 #ifdef DEBUG 50 #ifdef DEBUG
51 NSString *const GPBExceptionMessageKey = 51 NSString *const GPBExceptionMessageKey =
52 GPBNSStringifySymbol(GPBExceptionMessage); 52 GPBNSStringifySymbol(GPBExceptionMessage);
53 #endif // DEBUG 53 #endif // DEBUG
54 54
55 static NSString *const kGPBDataCoderKey = @"GPBData"; 55 static NSString *const kGPBDataCoderKey = @"GPBData";
56 56
57 #ifndef _GPBCompileAssert
58 #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
59 #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
60 #else
61 // Pre-Xcode 7 support.
62 #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
63 #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line , msg)
64 #define _GPBCompileAssert(test, msg) \
65 typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
66 #endif // __has_feature(c_static_assert) || __has_extension(c_static_assert)
67 #endif // _GPBCompileAssert
68
69 // 57 //
70 // PLEASE REMEMBER: 58 // PLEASE REMEMBER:
71 // 59 //
72 // This is the base class for *all* messages generated, so any selector defined, 60 // This is the base class for *all* messages generated, so any selector defined,
73 // *public* or *private* could end up colliding with a proto message field. So 61 // *public* or *private* could end up colliding with a proto message field. So
74 // avoid using selectors that could match a property, use C functions to hide 62 // avoid using selectors that could match a property, use C functions to hide
75 // them, etc. 63 // them, etc.
76 // 64 //
77 65
78 @interface GPBMessage () { 66 @interface GPBMessage () {
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 } 549 }
562 return array; 550 return array;
563 } 551 }
564 552
565 // This is like GPBGetObjectIvarWithField(), but for arrays, it should 553 // This is like GPBGetObjectIvarWithField(), but for arrays, it should
566 // only be used to wire the method into the class. 554 // only be used to wire the method into the class.
567 static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) { 555 static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
568 id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field); 556 id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
569 if (!array) { 557 if (!array) {
570 // Check again after getting the lock. 558 // Check again after getting the lock.
559 GPBPrepareReadOnlySemaphore(self);
571 dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER); 560 dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
572 array = GPBGetObjectIvarWithFieldNoAutocreate(self, field); 561 array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
573 if (!array) { 562 if (!array) {
574 array = CreateArrayForField(field, self); 563 array = CreateArrayForField(field, self);
575 GPBSetAutocreatedRetainedObjectIvarWithField(self, field, array); 564 GPBSetAutocreatedRetainedObjectIvarWithField(self, field, array);
576 } 565 }
577 dispatch_semaphore_signal(self->readOnlySemaphore_); 566 dispatch_semaphore_signal(self->readOnlySemaphore_);
578 } 567 }
579 return array; 568 return array;
580 } 569 }
(...skipping 10 matching lines...) Expand all
591 } 580 }
592 return dict; 581 return dict;
593 } 582 }
594 583
595 // This is like GPBGetObjectIvarWithField(), but for maps, it should 584 // This is like GPBGetObjectIvarWithField(), but for maps, it should
596 // only be used to wire the method into the class. 585 // only be used to wire the method into the class.
597 static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) { 586 static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
598 id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field); 587 id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
599 if (!dict) { 588 if (!dict) {
600 // Check again after getting the lock. 589 // Check again after getting the lock.
590 GPBPrepareReadOnlySemaphore(self);
601 dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER); 591 dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
602 dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field); 592 dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
603 if (!dict) { 593 if (!dict) {
604 dict = CreateMapForField(field, self); 594 dict = CreateMapForField(field, self);
605 GPBSetAutocreatedRetainedObjectIvarWithField(self, field, dict); 595 GPBSetAutocreatedRetainedObjectIvarWithField(self, field, dict);
606 } 596 }
607 dispatch_semaphore_signal(self->readOnlySemaphore_); 597 dispatch_semaphore_signal(self->readOnlySemaphore_);
608 } 598 }
609 return dict; 599 return dict;
610 } 600 }
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 // it supports unknowns/etc. 772 // it supports unknowns/etc.
783 fileDescriptor = 773 fileDescriptor =
784 [[GPBFileDescriptor alloc] initWithPackage:@"internal" 774 [[GPBFileDescriptor alloc] initWithPackage:@"internal"
785 syntax:GPBFileSyntaxProto2]; 775 syntax:GPBFileSyntaxProto2];
786 776
787 descriptor = [GPBDescriptor allocDescriptorForClass:[GPBMessage class] 777 descriptor = [GPBDescriptor allocDescriptorForClass:[GPBMessage class]
788 rootClass:Nil 778 rootClass:Nil
789 file:fileDescriptor 779 file:fileDescriptor
790 fields:NULL 780 fields:NULL
791 fieldCount:0 781 fieldCount:0
792 oneofs:NULL
793 oneofCount:0
794 enums:NULL
795 enumCount:0
796 ranges:NULL
797 rangeCount:0
798 storageSize:0 782 storageSize:0
799 wireFormat:NO]; 783 flags:0];
800 } 784 }
801 return descriptor; 785 return descriptor;
802 } 786 }
803 787
804 + (instancetype)message { 788 + (instancetype)message {
805 return [[[self alloc] init] autorelease]; 789 return [[[self alloc] init] autorelease];
806 } 790 }
807 791
808 - (instancetype)init { 792 - (instancetype)init {
809 if ((self = [super init])) { 793 if ((self = [super init])) {
810 messageStorage_ = (GPBMessage_StoragePtr)( 794 messageStorage_ = (GPBMessage_StoragePtr)(
811 ((uint8_t *)self) + class_getInstanceSize([self class])); 795 ((uint8_t *)self) + class_getInstanceSize([self class]));
812
813 readOnlySemaphore_ = dispatch_semaphore_create(1);
814 } 796 }
815 797
816 return self; 798 return self;
817 } 799 }
818 800
819 - (instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr { 801 - (instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr {
820 return [self initWithData:data extensionRegistry:nil error:errorPtr]; 802 return [self initWithData:data extensionRegistry:nil error:errorPtr];
821 } 803 }
822 804
823 - (instancetype)initWithData:(NSData *)data 805 - (instancetype)initWithData:(NSData *)data
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 } 861 }
880 } 862 }
881 #endif 863 #endif
882 } 864 }
883 return self; 865 return self;
884 } 866 }
885 867
886 - (void)dealloc { 868 - (void)dealloc {
887 [self internalClear:NO]; 869 [self internalClear:NO];
888 NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc."); 870 NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc.");
871 if (readOnlySemaphore_) {
872 dispatch_release(readOnlySemaphore_);
873 }
889 [super dealloc]; 874 [super dealloc];
890 } 875 }
891 876
892 - (void)copyFieldsInto:(GPBMessage *)message 877 - (void)copyFieldsInto:(GPBMessage *)message
893 zone:(NSZone *)zone 878 zone:(NSZone *)zone
894 descriptor:(GPBDescriptor *)descriptor { 879 descriptor:(GPBDescriptor *)descriptor {
895 // Copy all the storage... 880 // Copy all the storage...
896 memcpy(message->messageStorage_, messageStorage_, descriptor->storageSize_); 881 memcpy(message->messageStorage_, messageStorage_, descriptor->storageSize_);
897 882
898 GPBFileSyntax syntax = descriptor.file.syntax; 883 GPBFileSyntax syntax = descriptor.file.syntax;
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after
1716 // No default for repeated. 1701 // No default for repeated.
1717 if (extension.isRepeated) { 1702 if (extension.isRepeated) {
1718 return nil; 1703 return nil;
1719 } 1704 }
1720 // Non messages get their default. 1705 // Non messages get their default.
1721 if (!GPBExtensionIsMessage(extension)) { 1706 if (!GPBExtensionIsMessage(extension)) {
1722 return extension.defaultValue; 1707 return extension.defaultValue;
1723 } 1708 }
1724 1709
1725 // Check for an autocreated value. 1710 // Check for an autocreated value.
1711 GPBPrepareReadOnlySemaphore(self);
1726 dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER); 1712 dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER);
1727 value = [autocreatedExtensionMap_ objectForKey:extension]; 1713 value = [autocreatedExtensionMap_ objectForKey:extension];
1728 if (!value) { 1714 if (!value) {
1729 // Auto create the message extensions to match normal fields. 1715 // Auto create the message extensions to match normal fields.
1730 value = CreateMessageWithAutocreatorForExtension(extension.msgClass, self, 1716 value = CreateMessageWithAutocreatorForExtension(extension.msgClass, self,
1731 extension); 1717 extension);
1732 1718
1733 if (autocreatedExtensionMap_ == nil) { 1719 if (autocreatedExtensionMap_ == nil) {
1734 autocreatedExtensionMap_ = [[NSMutableDictionary alloc] init]; 1720 autocreatedExtensionMap_ = [[NSMutableDictionary alloc] init];
1735 } 1721 }
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1927 error:(NSError **)errorPtr { 1913 error:(NSError **)errorPtr {
1928 GPBMessage *message = [[[self alloc] init] autorelease]; 1914 GPBMessage *message = [[[self alloc] init] autorelease];
1929 @try { 1915 @try {
1930 [message mergeDelimitedFromCodedInputStream:input 1916 [message mergeDelimitedFromCodedInputStream:input
1931 extensionRegistry:extensionRegistry]; 1917 extensionRegistry:extensionRegistry];
1932 if (errorPtr) { 1918 if (errorPtr) {
1933 *errorPtr = nil; 1919 *errorPtr = nil;
1934 } 1920 }
1935 } 1921 }
1936 @catch (NSException *exception) { 1922 @catch (NSException *exception) {
1937 [message release];
1938 message = nil; 1923 message = nil;
1939 if (errorPtr) { 1924 if (errorPtr) {
1940 *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, 1925 *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData,
1941 exception.reason); 1926 exception.reason);
1942 } 1927 }
1943 } 1928 }
1944 #ifdef DEBUG 1929 #ifdef DEBUG
1945 if (message && !message.initialized) { 1930 if (message && !message.initialized) {
1946 [message release];
1947 message = nil; 1931 message = nil;
1948 if (errorPtr) { 1932 if (errorPtr) {
1949 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil); 1933 *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil);
1950 } 1934 }
1951 } 1935 }
1952 #endif 1936 #endif
1953 return message; 1937 return message;
1954 } 1938 }
1955 1939
1956 #pragma mark - Unknown Field Support 1940 #pragma mark - Unknown Field Support
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after
2612 } 2596 }
2613 if (!selfHas) { 2597 if (!selfHas) {
2614 // Same has values, was no, nothing else to check for this field. 2598 // Same has values, was no, nothing else to check for this field.
2615 continue; 2599 continue;
2616 } 2600 }
2617 // Now compare the values. 2601 // Now compare the values.
2618 GPBDataType fieldDataType = GPBGetFieldDataType(field); 2602 GPBDataType fieldDataType = GPBGetFieldDataType(field);
2619 size_t fieldOffset = field->description_->offset; 2603 size_t fieldOffset = field->description_->offset;
2620 switch (fieldDataType) { 2604 switch (fieldDataType) {
2621 case GPBDataTypeBool: { 2605 case GPBDataTypeBool: {
2622 BOOL *selfValPtr = (BOOL *)&selfStorage[fieldOffset]; 2606 // Bools are stored in has_bits to avoid needing explicit space in
2623 BOOL *otherValPtr = (BOOL *)&otherStorage[fieldOffset]; 2607 // the storage structure.
2624 if (*selfValPtr != *otherValPtr) { 2608 // (the field number passed to the HasIvar helper doesn't really
2609 // matter since the offset is never negative)
2610 BOOL selfValue = GPBGetHasIvar(self, (int32_t)(fieldOffset), 0);
2611 BOOL otherValue = GPBGetHasIvar(other, (int32_t)(fieldOffset), 0);
2612 if (selfValue != otherValue) {
2625 return NO; 2613 return NO;
2626 } 2614 }
2627 break; 2615 break;
2628 } 2616 }
2629 case GPBDataTypeSFixed32: 2617 case GPBDataTypeSFixed32:
2630 case GPBDataTypeInt32: 2618 case GPBDataTypeInt32:
2631 case GPBDataTypeSInt32: 2619 case GPBDataTypeSInt32:
2632 case GPBDataTypeEnum: 2620 case GPBDataTypeEnum:
2633 case GPBDataTypeFixed32: 2621 case GPBDataTypeFixed32:
2634 case GPBDataTypeUInt32: 2622 case GPBDataTypeUInt32:
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2723 result = prime * result + count; 2711 result = prime * result + count;
2724 } 2712 }
2725 } else if (GPBGetHasIvarField(self, field)) { 2713 } else if (GPBGetHasIvarField(self, field)) {
2726 // Just using the field number seemed simple/fast, but then a small 2714 // Just using the field number seemed simple/fast, but then a small
2727 // message class where all the same fields are always set (to different 2715 // message class where all the same fields are always set (to different
2728 // things would end up all with the same hash, so pull in some data). 2716 // things would end up all with the same hash, so pull in some data).
2729 GPBDataType fieldDataType = GPBGetFieldDataType(field); 2717 GPBDataType fieldDataType = GPBGetFieldDataType(field);
2730 size_t fieldOffset = field->description_->offset; 2718 size_t fieldOffset = field->description_->offset;
2731 switch (fieldDataType) { 2719 switch (fieldDataType) {
2732 case GPBDataTypeBool: { 2720 case GPBDataTypeBool: {
2733 BOOL *valPtr = (BOOL *)&storage[fieldOffset]; 2721 // Bools are stored in has_bits to avoid needing explicit space in
2734 result = prime * result + *valPtr; 2722 // the storage structure.
2723 // (the field number passed to the HasIvar helper doesn't really
2724 // matter since the offset is never negative)
2725 BOOL value = GPBGetHasIvar(self, (int32_t)(fieldOffset), 0);
2726 result = prime * result + value;
2735 break; 2727 break;
2736 } 2728 }
2737 case GPBDataTypeSFixed32: 2729 case GPBDataTypeSFixed32:
2738 case GPBDataTypeInt32: 2730 case GPBDataTypeInt32:
2739 case GPBDataTypeSInt32: 2731 case GPBDataTypeSInt32:
2740 case GPBDataTypeEnum: 2732 case GPBDataTypeEnum:
2741 case GPBDataTypeFixed32: 2733 case GPBDataTypeFixed32:
2742 case GPBDataTypeUInt32: 2734 case GPBDataTypeUInt32:
2743 case GPBDataTypeFloat: { 2735 case GPBDataTypeFloat: {
2744 _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits ); 2736 _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits );
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
3088 [obj class], 3080 [obj class],
3089 NSStringFromSelector(field->setHasSel_)]; 3081 NSStringFromSelector(field->setHasSel_)];
3090 } 3082 }
3091 GPBClearMessageField(obj, field); 3083 GPBClearMessageField(obj, field);
3092 }); 3084 });
3093 result.encodingSelector = @selector(setBool:); 3085 result.encodingSelector = @selector(setBool:);
3094 break; 3086 break;
3095 } else { 3087 } else {
3096 GPBOneofDescriptor *oneof = field->containingOneof_; 3088 GPBOneofDescriptor *oneof = field->containingOneof_;
3097 if (oneof && (sel == oneof->caseSel_)) { 3089 if (oneof && (sel == oneof->caseSel_)) {
3098 int32_t index = oneof->oneofDescription_->index; 3090 int32_t index = GPBFieldHasIndex(field);
3099 result.impToAdd = imp_implementationWithBlock(^(id obj) { 3091 result.impToAdd = imp_implementationWithBlock(^(id obj) {
3100 return GPBGetHasOneof(obj, index); 3092 return GPBGetHasOneof(obj, index);
3101 }); 3093 });
3102 result.encodingSelector = @selector(getEnum); 3094 result.encodingSelector = @selector(getEnum);
3103 break; 3095 break;
3104 } 3096 }
3105 } 3097 }
3106 } else { 3098 } else {
3107 // map<>/repeated fields. 3099 // map<>/repeated fields.
3108 if (sel == field->getSel_) { 3100 if (sel == field->getSel_) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3183 } 3175 }
3184 3176
3185 #pragma mark - KVC Support 3177 #pragma mark - KVC Support
3186 3178
3187 + (BOOL)accessInstanceVariablesDirectly { 3179 + (BOOL)accessInstanceVariablesDirectly {
3188 // Make sure KVC doesn't use instance variables. 3180 // Make sure KVC doesn't use instance variables.
3189 return NO; 3181 return NO;
3190 } 3182 }
3191 3183
3192 @end 3184 @end
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