Index: third_party/protobuf/objectivec/GPBMessage.m |
diff --git a/third_party/protobuf/objectivec/GPBMessage.m b/third_party/protobuf/objectivec/GPBMessage.m |
index 208cfe4ef4cf4a302da058782f58383dbc81e751..8134e25962dcb28c3b7b5258142ec251c078489f 100644 |
--- a/third_party/protobuf/objectivec/GPBMessage.m |
+++ b/third_party/protobuf/objectivec/GPBMessage.m |
@@ -35,7 +35,7 @@ |
#import "GPBArray_PackagePrivate.h" |
#import "GPBCodedInputStream_PackagePrivate.h" |
-#import "GPBCodedOutputStream.h" |
+#import "GPBCodedOutputStream_PackagePrivate.h" |
#import "GPBDescriptor_PackagePrivate.h" |
#import "GPBDictionary_PackagePrivate.h" |
#import "GPBExtensionInternals.h" |
@@ -54,18 +54,6 @@ NSString *const GPBExceptionMessageKey = |
static NSString *const kGPBDataCoderKey = @"GPBData"; |
-#ifndef _GPBCompileAssert |
- #if __has_feature(c_static_assert) || __has_extension(c_static_assert) |
- #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg) |
- #else |
- // Pre-Xcode 7 support. |
- #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg |
- #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg) |
- #define _GPBCompileAssert(test, msg) \ |
- typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] |
- #endif // __has_feature(c_static_assert) || __has_extension(c_static_assert) |
-#endif // _GPBCompileAssert |
- |
// |
// PLEASE REMEMBER: |
// |
@@ -568,6 +556,7 @@ static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) { |
id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field); |
if (!array) { |
// Check again after getting the lock. |
+ GPBPrepareReadOnlySemaphore(self); |
dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER); |
array = GPBGetObjectIvarWithFieldNoAutocreate(self, field); |
if (!array) { |
@@ -598,6 +587,7 @@ static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) { |
id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field); |
if (!dict) { |
// Check again after getting the lock. |
+ GPBPrepareReadOnlySemaphore(self); |
dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER); |
dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field); |
if (!dict) { |
@@ -789,14 +779,8 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { |
file:fileDescriptor |
fields:NULL |
fieldCount:0 |
- oneofs:NULL |
- oneofCount:0 |
- enums:NULL |
- enumCount:0 |
- ranges:NULL |
- rangeCount:0 |
storageSize:0 |
- wireFormat:NO]; |
+ flags:0]; |
} |
return descriptor; |
} |
@@ -809,8 +793,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { |
if ((self = [super init])) { |
messageStorage_ = (GPBMessage_StoragePtr)( |
((uint8_t *)self) + class_getInstanceSize([self class])); |
- |
- readOnlySemaphore_ = dispatch_semaphore_create(1); |
} |
return self; |
@@ -886,6 +868,9 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { |
- (void)dealloc { |
[self internalClear:NO]; |
NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc."); |
+ if (readOnlySemaphore_) { |
+ dispatch_release(readOnlySemaphore_); |
+ } |
[super dealloc]; |
} |
@@ -1723,6 +1708,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { |
} |
// Check for an autocreated value. |
+ GPBPrepareReadOnlySemaphore(self); |
dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER); |
value = [autocreatedExtensionMap_ objectForKey:extension]; |
if (!value) { |
@@ -1934,7 +1920,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { |
} |
} |
@catch (NSException *exception) { |
- [message release]; |
message = nil; |
if (errorPtr) { |
*errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, |
@@ -1943,7 +1928,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { |
} |
#ifdef DEBUG |
if (message && !message.initialized) { |
- [message release]; |
message = nil; |
if (errorPtr) { |
*errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil); |
@@ -2619,9 +2603,13 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( |
size_t fieldOffset = field->description_->offset; |
switch (fieldDataType) { |
case GPBDataTypeBool: { |
- BOOL *selfValPtr = (BOOL *)&selfStorage[fieldOffset]; |
- BOOL *otherValPtr = (BOOL *)&otherStorage[fieldOffset]; |
- if (*selfValPtr != *otherValPtr) { |
+ // Bools are stored in has_bits to avoid needing explicit space in |
+ // the storage structure. |
+ // (the field number passed to the HasIvar helper doesn't really |
+ // matter since the offset is never negative) |
+ BOOL selfValue = GPBGetHasIvar(self, (int32_t)(fieldOffset), 0); |
+ BOOL otherValue = GPBGetHasIvar(other, (int32_t)(fieldOffset), 0); |
+ if (selfValue != otherValue) { |
return NO; |
} |
break; |
@@ -2730,8 +2718,12 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( |
size_t fieldOffset = field->description_->offset; |
switch (fieldDataType) { |
case GPBDataTypeBool: { |
- BOOL *valPtr = (BOOL *)&storage[fieldOffset]; |
- result = prime * result + *valPtr; |
+ // Bools are stored in has_bits to avoid needing explicit space in |
+ // the storage structure. |
+ // (the field number passed to the HasIvar helper doesn't really |
+ // matter since the offset is never negative) |
+ BOOL value = GPBGetHasIvar(self, (int32_t)(fieldOffset), 0); |
+ result = prime * result + value; |
break; |
} |
case GPBDataTypeSFixed32: |
@@ -3095,7 +3087,7 @@ static void ResolveIvarSet(GPBFieldDescriptor *field, |
} else { |
GPBOneofDescriptor *oneof = field->containingOneof_; |
if (oneof && (sel == oneof->caseSel_)) { |
- int32_t index = oneof->oneofDescription_->index; |
+ int32_t index = GPBFieldHasIndex(field); |
result.impToAdd = imp_implementationWithBlock(^(id obj) { |
return GPBGetHasOneof(obj, index); |
}); |