[ObjC] Avoid data copy within parseDelimitedFromCodedInputStream:...
PiperOrigin-RevId: 509893038
diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m
index a06bb6f..1c1c8f8 100644
--- a/objectivec/GPBMessage.m
+++ b/objectivec/GPBMessage.m
@@ -1994,19 +1994,6 @@
[input release];
}
-#pragma mark - mergeDelimitedFrom
-
-- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:(id<GPBExtensionRegistry>)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 @@
+ (instancetype)parseDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
extensionRegistry:(id<GPBExtensionRegistry>)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 70b47a5..1b3a993 100644
--- a/objectivec/GPBMessage_PackagePrivate.h
+++ b/objectivec/GPBMessage_PackagePrivate.h
@@ -80,11 +80,6 @@
- (void)mergeFromCodedInputStream:(GPBCodedInputStream *)input
extensionRegistry:(id<GPBExtensionRegistry>)extensionRegistry;
-// Parses the next delimited message of this type from the input and merges it
-// with this message.
-- (void)mergeDelimitedFromCodedInputStream:(GPBCodedInputStream *)input
- extensionRegistry:(id<GPBExtensionRegistry>)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 5a7dc16..68b62ef 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