| 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);
|
| });
|
|
|