| Index: third_party/protobuf/objectivec/GPBMessage.m | 
| diff --git a/third_party/protobuf/objectivec/GPBMessage.m b/third_party/protobuf/objectivec/GPBMessage.m | 
| index 4a6f0612acb95b39d0591d6d95827e1046ef05e8..8134e25962dcb28c3b7b5258142ec251c078489f 100644 | 
| --- a/third_party/protobuf/objectivec/GPBMessage.m | 
| +++ b/third_party/protobuf/objectivec/GPBMessage.m | 
| @@ -44,16 +44,13 @@ | 
| #import "GPBUnknownFieldSet_PackagePrivate.h" | 
| #import "GPBUtilities_PackagePrivate.h" | 
|  | 
| -// 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" | 
| - | 
| NSString *const GPBMessageErrorDomain = | 
| GPBNSStringifySymbol(GPBMessageErrorDomain); | 
|  | 
| -NSString *const GPBErrorReasonKey = @"Reason"; | 
| +#ifdef DEBUG | 
| +NSString *const GPBExceptionMessageKey = | 
| +    GPBNSStringifySymbol(GPBExceptionMessage); | 
| +#endif  // DEBUG | 
|  | 
| static NSString *const kGPBDataCoderKey = @"GPBData"; | 
|  | 
| @@ -98,36 +95,21 @@ static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap, | 
| NSZone *zone) | 
| __attribute__((ns_returns_retained)); | 
|  | 
| -#ifdef DEBUG | 
| static NSError *MessageError(NSInteger code, NSDictionary *userInfo) { | 
| return [NSError errorWithDomain:GPBMessageErrorDomain | 
| code:code | 
| userInfo:userInfo]; | 
| } | 
| -#endif | 
|  | 
| -static NSError *ErrorFromException(NSException *exception) { | 
| -  NSError *error = nil; | 
| - | 
| -  if ([exception.name isEqual:GPBCodedInputStreamException]) { | 
| -    NSDictionary *exceptionInfo = exception.userInfo; | 
| -    error = exceptionInfo[GPBCodedInputStreamUnderlyingErrorKey]; | 
| +static NSError *MessageErrorWithReason(NSInteger code, NSString *reason) { | 
| +  NSDictionary *userInfo = nil; | 
| +  if ([reason length]) { | 
| +    userInfo = @{ @"Reason" : reason }; | 
| } | 
| - | 
| -  if (!error) { | 
| -    NSString *reason = exception.reason; | 
| -    NSDictionary *userInfo = nil; | 
| -    if ([reason length]) { | 
| -      userInfo = @{ GPBErrorReasonKey : reason }; | 
| -    } | 
| - | 
| -    error = [NSError errorWithDomain:GPBMessageErrorDomain | 
| -                                code:GPBMessageErrorCodeOther | 
| -                            userInfo:userInfo]; | 
| -  } | 
| -  return error; | 
| +  return MessageError(code, userInfo); | 
| } | 
|  | 
| + | 
| static void CheckExtension(GPBMessage *self, | 
| GPBExtensionDescriptor *extension) { | 
| if ([self class] != extension.containingMessageClass) { | 
| @@ -712,7 +694,7 @@ void GPBClearMessageAutocreator(GPBMessage *self) { | 
| return; | 
| } | 
|  | 
| -#if defined(DEBUG) && DEBUG && !defined(NS_BLOCK_ASSERTIONS) | 
| +#if DEBUG && !defined(NS_BLOCK_ASSERTIONS) | 
| // Either the autocreator must have its "has" flag set to YES, or it must be | 
| // NO and not equal to ourselves. | 
| BOOL autocreatorHas = | 
| @@ -834,7 +816,8 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { | 
| [self release]; | 
| self = nil; | 
| if (errorPtr) { | 
| -        *errorPtr = ErrorFromException(exception); | 
| +        *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, | 
| +                                           exception.reason); | 
| } | 
| } | 
| #ifdef DEBUG | 
| @@ -865,7 +848,8 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { | 
| [self release]; | 
| self = nil; | 
| if (errorPtr) { | 
| -        *errorPtr = ErrorFromException(exception); | 
| +        *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, | 
| +                                           exception.reason); | 
| } | 
| } | 
| #ifdef DEBUG | 
| @@ -1752,7 +1736,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { | 
| } | 
|  | 
| - (BOOL)hasExtension:(GPBExtensionDescriptor *)extension { | 
| -#if defined(DEBUG) && DEBUG | 
| +#if DEBUG | 
| CheckExtension(self, extension); | 
| #endif  // DEBUG | 
| return nil != [extensionMap_ objectForKey:extension]; | 
| @@ -1777,6 +1761,11 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { | 
| } | 
| } | 
|  | 
| +- (NSArray *)sortedExtensionsInUse { | 
| +  return [[extensionMap_ allKeys] | 
| +      sortedArrayUsingSelector:@selector(compareByFieldNumber:)]; | 
| +} | 
| + | 
| - (void)setExtension:(GPBExtensionDescriptor *)extension value:(id)value { | 
| if (!value) { | 
| [self clearExtension:extension]; | 
| @@ -1933,7 +1922,8 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { | 
| @catch (NSException *exception) { | 
| message = nil; | 
| if (errorPtr) { | 
| -      *errorPtr = ErrorFromException(exception); | 
| +      *errorPtr = MessageErrorWithReason(GPBMessageErrorCodeMalformedData, | 
| +                                         exception.reason); | 
| } | 
| } | 
| #ifdef DEBUG | 
| @@ -2274,9 +2264,6 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| while (YES) { | 
| BOOL merged = NO; | 
| tag = GPBCodedInputStreamReadTag(state); | 
| -    if (tag == 0) { | 
| -      break;  // Reached end. | 
| -    } | 
| for (NSUInteger i = 0; i < numFields; ++i) { | 
| if (startingIndex >= numFields) startingIndex = 0; | 
| GPBFieldDescriptor *fieldDescriptor = fields[startingIndex]; | 
| @@ -2315,7 +2302,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| } | 
| }  // for(i < numFields) | 
|  | 
| -    if (!merged && (tag != 0)) { | 
| +    if (!merged) { | 
| // Primitive, repeated types can be packed on unpacked on the wire, and | 
| // are parsed either way.  The above loop covered tag in the preferred | 
| // for, so this need to check the alternate form. | 
| @@ -2570,7 +2557,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
|  | 
| #pragma mark - isEqual: & hash Support | 
|  | 
| -- (BOOL)isEqual:(id)other { | 
| +- (BOOL)isEqual:(GPBMessage *)other { | 
| if (other == self) { | 
| return YES; | 
| } | 
| @@ -2579,10 +2566,9 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| return NO; | 
| } | 
|  | 
| -  GPBMessage *otherMsg = other; | 
| GPBDescriptor *descriptor = [[self class] descriptor]; | 
| uint8_t *selfStorage = (uint8_t *)messageStorage_; | 
| -  uint8_t *otherStorage = (uint8_t *)otherMsg->messageStorage_; | 
| +  uint8_t *otherStorage = (uint8_t *)other->messageStorage_; | 
|  | 
| for (GPBFieldDescriptor *field in descriptor->fields_) { | 
| if (GPBFieldIsMapOrArray(field)) { | 
| @@ -2635,7 +2621,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| case GPBDataTypeFixed32: | 
| case GPBDataTypeUInt32: | 
| case GPBDataTypeFloat: { | 
| -          GPBInternalCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits); | 
| +          _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits); | 
| // These are all 32bit, signed/unsigned doesn't matter for equality. | 
| uint32_t *selfValPtr = (uint32_t *)&selfStorage[fieldOffset]; | 
| uint32_t *otherValPtr = (uint32_t *)&otherStorage[fieldOffset]; | 
| @@ -2650,7 +2636,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| case GPBDataTypeFixed64: | 
| case GPBDataTypeUInt64: | 
| case GPBDataTypeDouble: { | 
| -          GPBInternalCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits); | 
| +          _GPBCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits); | 
| // These are all 64bit, signed/unsigned doesn't matter for equality. | 
| uint64_t *selfValPtr = (uint64_t *)&selfStorage[fieldOffset]; | 
| uint64_t *otherValPtr = (uint64_t *)&otherStorage[fieldOffset]; | 
| @@ -2676,14 +2662,14 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| }  // for(fields) | 
|  | 
| // nil and empty are equal | 
| -  if (extensionMap_.count != 0 || otherMsg->extensionMap_.count != 0) { | 
| -    if (![extensionMap_ isEqual:otherMsg->extensionMap_]) { | 
| +  if (extensionMap_.count != 0 || other->extensionMap_.count != 0) { | 
| +    if (![extensionMap_ isEqual:other->extensionMap_]) { | 
| return NO; | 
| } | 
| } | 
|  | 
| // nil and empty are equal | 
| -  GPBUnknownFieldSet *otherUnknowns = otherMsg->unknownFields_; | 
| +  GPBUnknownFieldSet *otherUnknowns = other->unknownFields_; | 
| if ([unknownFields_ countOfFields] != 0 || | 
| [otherUnknowns countOfFields] != 0) { | 
| if (![unknownFields_ isEqual:otherUnknowns]) { | 
| @@ -2747,7 +2733,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| case GPBDataTypeFixed32: | 
| case GPBDataTypeUInt32: | 
| case GPBDataTypeFloat: { | 
| -          GPBInternalCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits); | 
| +          _GPBCompileAssert(sizeof(float) == sizeof(uint32_t), float_not_32_bits); | 
| // These are all 32bit, just mix it in. | 
| uint32_t *valPtr = (uint32_t *)&storage[fieldOffset]; | 
| result = prime * result + *valPtr; | 
| @@ -2759,7 +2745,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| case GPBDataTypeFixed64: | 
| case GPBDataTypeUInt64: | 
| case GPBDataTypeDouble: { | 
| -          GPBInternalCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits); | 
| +          _GPBCompileAssert(sizeof(double) == sizeof(uint64_t), double_not_64_bits); | 
| // These are all 64bit, just mix what fits into an NSUInteger in. | 
| uint64_t *valPtr = (uint64_t *)&storage[fieldOffset]; | 
| result = prime * result + (NSUInteger)(*valPtr); | 
| @@ -2806,7 +2792,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream( | 
| return description; | 
| } | 
|  | 
| -#if defined(DEBUG) && DEBUG | 
| +#if DEBUG | 
|  | 
| // Xcode 5.1 added support for custom quick look info. | 
| // https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/CustomClassDisplay_in_QuickLook/CH01-quick_look_for_custom_objects/CH01-quick_look_for_custom_objects.html#//apple_ref/doc/uid/TP40014001-CH2-SW1 | 
| @@ -3196,35 +3182,3 @@ static void ResolveIvarSet(GPBFieldDescriptor *field, | 
| } | 
|  | 
| @end | 
| - | 
| -#pragma mark - Messages from GPBUtilities.h but defined here for access to helpers. | 
| - | 
| -// Only exists for public api, no core code should use this. | 
| -id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field) { | 
| -#if defined(DEBUG) && DEBUG | 
| -  if (field.fieldType != GPBFieldTypeRepeated) { | 
| -    [NSException raise:NSInvalidArgumentException | 
| -                format:@"%@.%@ is not a repeated field.", | 
| -     [self class], field.name]; | 
| -  } | 
| -#endif | 
| -  GPBDescriptor *descriptor = [[self class] descriptor]; | 
| -  GPBFileSyntax syntax = descriptor.file.syntax; | 
| -  return GetOrCreateArrayIvarWithField(self, field, syntax); | 
| -} | 
| - | 
| -// Only exists for public api, no core code should use this. | 
| -id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field) { | 
| -#if defined(DEBUG) && DEBUG | 
| -  if (field.fieldType != GPBFieldTypeMap) { | 
| -    [NSException raise:NSInvalidArgumentException | 
| -                format:@"%@.%@ is not a map<> field.", | 
| -     [self class], field.name]; | 
| -  } | 
| -#endif | 
| -  GPBDescriptor *descriptor = [[self class] descriptor]; | 
| -  GPBFileSyntax syntax = descriptor.file.syntax; | 
| -  return GetOrCreateMapIvarWithField(self, field, syntax); | 
| -} | 
| - | 
| -#pragma clang diagnostic pop | 
|  |