diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m index a06bb6feb8..1c1c8f8073 100644 --- a/objectivec/GPBMessage.m +++ b/objectivec/GPBMessage.m @@ -1994,19 +1994,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { [input release]; } -#pragma mark - mergeDelimitedFrom - -- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input - extensionRegistry:(id)extensionRegistry { - GPBCodedInputStreamState *state = &input->state_; - if (GPBCodedInputStreamIsAtEnd(state)) { - return; - } - NSData *data = GPBCodedInputStreamReadRetainedBytesNoCopy(state); - [self mergeFromData:data extensionRegistry:extensionRegistry]; - [data release]; -} - #pragma mark - Parse From Data Support + (instancetype)parseFromData:(NSData *)data error:(NSError **)errorPtr { @@ -2033,27 +2020,26 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { + (instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input extensionRegistry:(id)extensionRegistry error:(NSError **)errorPtr { - GPBMessage *message = [[[self alloc] init] autorelease]; + GPBMessage *result = nil; @try { - [message mergeDelimitedFromCodedInputStream:input extensionRegistry:extensionRegistry]; - if (errorPtr) { - *errorPtr = nil; + uint64_t size = GPBCodedInputStreamReadUInt64(&input->state_); + size_t oldLimit = [input pushLimit:size]; + result = [self parseFromCodedInputStream:input + extensionRegistry:extensionRegistry + error:errorPtr]; + if (result) { + [input popLimit:oldLimit]; + if (errorPtr) { + *errorPtr = nil; + } } } @catch (NSException *exception) { - message = nil; + result = nil; if (errorPtr) { *errorPtr = ErrorFromException(exception); } } -#ifdef DEBUG - if (message && !message.initialized) { - message = nil; - if (errorPtr) { - *errorPtr = MessageError(GPBMessageErrorCodeMissingRequiredField, nil); - } - } -#endif - return message; + return result; } #pragma mark - Unknown Field Support diff --git a/objectivec/GPBMessage_PackagePrivate.h b/objectivec/GPBMessage_PackagePrivate.h index 70b47a59bc..1b3a99332d 100644 --- a/objectivec/GPBMessage_PackagePrivate.h +++ b/objectivec/GPBMessage_PackagePrivate.h @@ -80,11 +80,6 @@ typedef struct GPBMessage_Storage *GPBMessage_StoragePtr; - (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input extensionRegistry:(id)extensionRegistry; -// Parses the next delimited message of this type from the input and merges it -// with this message. -- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input - extensionRegistry:(id)extensionRegistry; - - (void)addUnknownMapEntry:(int32_t)fieldNum value:(NSData *)data; @end diff --git a/objectivec/Tests/GPBMessageTests+Serialization.m b/objectivec/Tests/GPBMessageTests+Serialization.m index 5a7dc16c84..68b62ef7ac 100644 --- a/objectivec/Tests/GPBMessageTests+Serialization.m +++ b/objectivec/Tests/GPBMessageTests+Serialization.m @@ -1276,7 +1276,7 @@ XCTAssertNil(result); XCTAssertNotNil(error); XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain); - XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSize); + XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit); } #ifdef DEBUG