[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