[ObjC] Avoid data copy within parseDelimitedFromCodedInputStream:...

PiperOrigin-RevId: 509893038
pull/11953/head
Protobuf Team Bot 2 years ago committed by Copybara-Service
parent f5f5a1faf1
commit 0c013ec412
  1. 40
      objectivec/GPBMessage.m
  2. 5
      objectivec/GPBMessage_PackagePrivate.h
  3. 2
      objectivec/Tests/GPBMessageTests+Serialization.m

@ -1994,19 +1994,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
[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 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
+ (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

@ -80,11 +80,6 @@ typedef struct GPBMessage_Storage *GPBMessage_StoragePtr;
- (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

@ -1276,7 +1276,7 @@
XCTAssertNil(result);
XCTAssertNotNil(error);
XCTAssertEqualObjects(error.domain, GPBCodedInputStreamErrorDomain);
XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSize);
XCTAssertEqual(error.code, GPBCodedInputStreamErrorInvalidSubsectionLimit);
}
#ifdef DEBUG

Loading…
Cancel
Save