|
@@ -99,15 +99,13 @@ static id CreateArrayForField(GPBFieldDescriptor *field,
|
|
|
GPBMessage *autocreator)
|
|
|
__attribute__((ns_returns_retained));
|
|
|
static id GetOrCreateArrayIvarWithField(GPBMessage *self,
|
|
|
- GPBFieldDescriptor *field,
|
|
|
- GPBFileSyntax syntax);
|
|
|
+ GPBFieldDescriptor *field);
|
|
|
static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
|
|
|
static id CreateMapForField(GPBFieldDescriptor *field,
|
|
|
GPBMessage *autocreator)
|
|
|
__attribute__((ns_returns_retained));
|
|
|
static id GetOrCreateMapIvarWithField(GPBMessage *self,
|
|
|
- GPBFieldDescriptor *field,
|
|
|
- GPBFileSyntax syntax);
|
|
|
+ GPBFieldDescriptor *field);
|
|
|
static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field);
|
|
|
static NSMutableDictionary *CloneExtensionMap(NSDictionary *extensionMap,
|
|
|
NSZone *zone)
|
|
@@ -560,10 +558,10 @@ static id CreateMapForField(GPBFieldDescriptor *field,
|
|
|
|
|
|
#if !defined(__clang_analyzer__)
|
|
|
// These functions are blocked from the analyzer because the analyzer sees the
|
|
|
-// GPBSetRetainedObjectIvarWithFieldInternal() call as consuming the array/map,
|
|
|
+// GPBSetRetainedObjectIvarWithFieldPrivate() call as consuming the array/map,
|
|
|
// so use of the array/map after the call returns is flagged as a use after
|
|
|
// free.
|
|
|
-// But GPBSetRetainedObjectIvarWithFieldInternal() is "consuming" the retain
|
|
|
+// But GPBSetRetainedObjectIvarWithFieldPrivate() is "consuming" the retain
|
|
|
// count be holding onto the object (it is transferring it), the object is
|
|
|
// still valid after returning from the call. The other way to avoid this
|
|
|
// would be to add a -retain/-autorelease, but that would force every
|
|
@@ -571,14 +569,13 @@ static id CreateMapForField(GPBFieldDescriptor *field,
|
|
|
// and performance hit.
|
|
|
|
|
|
static id GetOrCreateArrayIvarWithField(GPBMessage *self,
|
|
|
- GPBFieldDescriptor *field,
|
|
|
- GPBFileSyntax syntax) {
|
|
|
+ GPBFieldDescriptor *field) {
|
|
|
id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
|
if (!array) {
|
|
|
// No lock needed, this is called from places expecting to mutate
|
|
|
// so no threading protection is needed.
|
|
|
array = CreateArrayForField(field, nil);
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(self, field, array, syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(self, field, array);
|
|
|
}
|
|
|
return array;
|
|
|
}
|
|
@@ -602,14 +599,13 @@ static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
|
|
|
}
|
|
|
|
|
|
static id GetOrCreateMapIvarWithField(GPBMessage *self,
|
|
|
- GPBFieldDescriptor *field,
|
|
|
- GPBFileSyntax syntax) {
|
|
|
+ GPBFieldDescriptor *field) {
|
|
|
id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
|
if (!dict) {
|
|
|
// No lock needed, this is called from places expecting to mutate
|
|
|
// so no threading protection is needed.
|
|
|
dict = CreateMapForField(field, nil);
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(self, field, dict, syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(self, field, dict);
|
|
|
}
|
|
|
return dict;
|
|
|
}
|
|
@@ -668,9 +664,8 @@ void GPBBecomeVisibleToAutocreator(GPBMessage *self) {
|
|
|
// This will recursively make all parent messages visible until it reaches a
|
|
|
// super-creator that's visible.
|
|
|
if (self->autocreatorField_) {
|
|
|
- GPBFileSyntax syntax = [self->autocreator_ descriptor].file.syntax;
|
|
|
- GPBSetObjectIvarWithFieldInternal(self->autocreator_,
|
|
|
- self->autocreatorField_, self, syntax);
|
|
|
+ GPBSetObjectIvarWithFieldPrivate(self->autocreator_,
|
|
|
+ self->autocreatorField_, self);
|
|
|
} else {
|
|
|
[self->autocreator_ setExtension:self->autocreatorExtension_ value:self];
|
|
|
}
|
|
@@ -936,8 +931,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
|
// Copy all the storage...
|
|
|
memcpy(message->messageStorage_, messageStorage_, descriptor->storageSize_);
|
|
|
|
|
|
- GPBFileSyntax syntax = descriptor.file.syntax;
|
|
|
-
|
|
|
// Loop over the fields doing fixup...
|
|
|
for (GPBFieldDescriptor *field in descriptor->fields_) {
|
|
|
if (GPBFieldIsMapOrArray(field)) {
|
|
@@ -1005,8 +998,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
|
// We retain here because the memcpy picked up the pointer value and
|
|
|
// the next call to SetRetainedObject... will release the current value.
|
|
|
[value retain];
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(message, field, newValue,
|
|
|
- syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(message, field, newValue);
|
|
|
}
|
|
|
} else if (GPBFieldDataTypeIsMessage(field)) {
|
|
|
// For object types, if we have a value, copy it. If we don't,
|
|
@@ -1018,8 +1010,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
|
// We retain here because the memcpy picked up the pointer value and
|
|
|
// the next call to SetRetainedObject... will release the current value.
|
|
|
[value retain];
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(message, field, newValue,
|
|
|
- syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(message, field, newValue);
|
|
|
} else {
|
|
|
uint8_t *storage = (uint8_t *)message->messageStorage_;
|
|
|
id *typePtr = (id *)&storage[field->description_->offset];
|
|
@@ -1033,8 +1024,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
|
// We retain here because the memcpy picked up the pointer value and
|
|
|
// the next call to SetRetainedObject... will release the current value.
|
|
|
[value retain];
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(message, field, newValue,
|
|
|
- syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(message, field, newValue);
|
|
|
} else {
|
|
|
// memcpy took care of the rest of the primitive fields if they were set.
|
|
|
}
|
|
@@ -2161,13 +2151,13 @@ static void MergeSingleFieldFromCodedInputStream(
|
|
|
#define CASE_SINGLE_POD(NAME, TYPE, FUNC_TYPE) \
|
|
|
case GPBDataType##NAME: { \
|
|
|
TYPE val = GPBCodedInputStreamRead##NAME(&input->state_); \
|
|
|
- GPBSet##FUNC_TYPE##IvarWithFieldInternal(self, field, val, syntax); \
|
|
|
+ GPBSet##FUNC_TYPE##IvarWithFieldPrivate(self, field, val); \
|
|
|
break; \
|
|
|
}
|
|
|
#define CASE_SINGLE_OBJECT(NAME) \
|
|
|
case GPBDataType##NAME: { \
|
|
|
id val = GPBCodedInputStreamReadRetained##NAME(&input->state_); \
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(self, field, val, syntax); \
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(self, field, val); \
|
|
|
break; \
|
|
|
}
|
|
|
CASE_SINGLE_POD(Bool, BOOL, Bool)
|
|
@@ -2198,7 +2188,7 @@ static void MergeSingleFieldFromCodedInputStream(
|
|
|
} else {
|
|
|
GPBMessage *message = [[field.msgClass alloc] init];
|
|
|
[input readMessage:message extensionRegistry:extensionRegistry];
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(self, field, message, syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(self, field, message);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -2217,7 +2207,7 @@ static void MergeSingleFieldFromCodedInputStream(
|
|
|
[input readGroup:GPBFieldNumber(field)
|
|
|
message:message
|
|
|
extensionRegistry:extensionRegistry];
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(self, field, message, syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(self, field, message);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -2226,7 +2216,7 @@ static void MergeSingleFieldFromCodedInputStream(
|
|
|
int32_t val = GPBCodedInputStreamReadEnum(&input->state_);
|
|
|
if (GPBHasPreservingUnknownEnumSemantics(syntax) ||
|
|
|
[field isValidEnumValue:val]) {
|
|
|
- GPBSetInt32IvarWithFieldInternal(self, field, val, syntax);
|
|
|
+ GPBSetInt32IvarWithFieldPrivate(self, field, val);
|
|
|
} else {
|
|
|
GPBUnknownFieldSet *unknownFields = GetOrMakeUnknownFields(self);
|
|
|
[unknownFields mergeVarintField:GPBFieldNumber(field) value:val];
|
|
@@ -2240,7 +2230,7 @@ static void MergeRepeatedPackedFieldFromCodedInputStream(
|
|
|
GPBCodedInputStream *input) {
|
|
|
GPBDataType fieldDataType = GPBGetFieldDataType(field);
|
|
|
GPBCodedInputStreamState *state = &input->state_;
|
|
|
- id genericArray = GetOrCreateArrayIvarWithField(self, field, syntax);
|
|
|
+ id genericArray = GetOrCreateArrayIvarWithField(self, field);
|
|
|
int32_t length = GPBCodedInputStreamReadInt32(state);
|
|
|
size_t limit = GPBCodedInputStreamPushLimit(state, length);
|
|
|
while (GPBCodedInputStreamBytesUntilLimit(state) > 0) {
|
|
@@ -2293,7 +2283,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
GPBMessage *self, GPBFieldDescriptor *field, GPBFileSyntax syntax,
|
|
|
GPBCodedInputStream *input, GPBExtensionRegistry *extensionRegistry) {
|
|
|
GPBCodedInputStreamState *state = &input->state_;
|
|
|
- id genericArray = GetOrCreateArrayIvarWithField(self, field, syntax);
|
|
|
+ id genericArray = GetOrCreateArrayIvarWithField(self, field);
|
|
|
switch (GPBGetFieldDataType(field)) {
|
|
|
#define CASE_REPEATED_NOT_PACKED_POD(NAME, TYPE, ARRAY_TYPE) \
|
|
|
case GPBDataType##NAME: { \
|
|
@@ -2395,7 +2385,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
} else { // fieldType == GPBFieldTypeMap
|
|
|
// GPB*Dictionary or NSDictionary, exact type doesn't matter at this
|
|
|
// point.
|
|
|
- id map = GetOrCreateMapIvarWithField(self, fieldDescriptor, syntax);
|
|
|
+ id map = GetOrCreateMapIvarWithField(self, fieldDescriptor);
|
|
|
[input readMapEntry:map
|
|
|
extensionRegistry:extensionRegistry
|
|
|
field:fieldDescriptor
|
|
@@ -2469,7 +2459,6 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
GPBBecomeVisibleToAutocreator(self);
|
|
|
|
|
|
GPBDescriptor *descriptor = [[self class] descriptor];
|
|
|
- GPBFileSyntax syntax = descriptor.file.syntax;
|
|
|
|
|
|
for (GPBFieldDescriptor *field in descriptor->fields_) {
|
|
|
GPBFieldType fieldType = field.fieldType;
|
|
@@ -2483,44 +2472,44 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
GPBDataType fieldDataType = GPBGetFieldDataType(field);
|
|
|
switch (fieldDataType) {
|
|
|
case GPBDataTypeBool:
|
|
|
- GPBSetBoolIvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageBoolField(other, field), syntax);
|
|
|
+ GPBSetBoolIvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageBoolField(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeSFixed32:
|
|
|
case GPBDataTypeEnum:
|
|
|
case GPBDataTypeInt32:
|
|
|
case GPBDataTypeSInt32:
|
|
|
- GPBSetInt32IvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageInt32Field(other, field), syntax);
|
|
|
+ GPBSetInt32IvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageInt32Field(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeFixed32:
|
|
|
case GPBDataTypeUInt32:
|
|
|
- GPBSetUInt32IvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageUInt32Field(other, field), syntax);
|
|
|
+ GPBSetUInt32IvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageUInt32Field(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeSFixed64:
|
|
|
case GPBDataTypeInt64:
|
|
|
case GPBDataTypeSInt64:
|
|
|
- GPBSetInt64IvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageInt64Field(other, field), syntax);
|
|
|
+ GPBSetInt64IvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageInt64Field(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeFixed64:
|
|
|
case GPBDataTypeUInt64:
|
|
|
- GPBSetUInt64IvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageUInt64Field(other, field), syntax);
|
|
|
+ GPBSetUInt64IvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageUInt64Field(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeFloat:
|
|
|
- GPBSetFloatIvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageFloatField(other, field), syntax);
|
|
|
+ GPBSetFloatIvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageFloatField(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeDouble:
|
|
|
- GPBSetDoubleIvarWithFieldInternal(
|
|
|
- self, field, GPBGetMessageDoubleField(other, field), syntax);
|
|
|
+ GPBSetDoubleIvarWithFieldPrivate(
|
|
|
+ self, field, GPBGetMessageDoubleField(other, field));
|
|
|
break;
|
|
|
case GPBDataTypeBytes:
|
|
|
case GPBDataTypeString: {
|
|
|
id otherVal = GPBGetObjectIvarWithFieldNoAutocreate(other, field);
|
|
|
- GPBSetObjectIvarWithFieldInternal(self, field, otherVal, syntax);
|
|
|
+ GPBSetObjectIvarWithFieldPrivate(self, field, otherVal);
|
|
|
break;
|
|
|
}
|
|
|
case GPBDataTypeMessage:
|
|
@@ -2532,8 +2521,7 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
[message mergeFrom:otherVal];
|
|
|
} else {
|
|
|
GPBMessage *message = [otherVal copy];
|
|
|
- GPBSetRetainedObjectIvarWithFieldInternal(self, field, message,
|
|
|
- syntax);
|
|
|
+ GPBSetRetainedObjectIvarWithFieldPrivate(self, field, message);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -2547,17 +2535,17 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
GPBDataType fieldDataType = field->description_->dataType;
|
|
|
if (GPBDataTypeIsObject(fieldDataType)) {
|
|
|
NSMutableArray *resultArray =
|
|
|
- GetOrCreateArrayIvarWithField(self, field, syntax);
|
|
|
+ GetOrCreateArrayIvarWithField(self, field);
|
|
|
[resultArray addObjectsFromArray:otherArray];
|
|
|
} else if (fieldDataType == GPBDataTypeEnum) {
|
|
|
GPBEnumArray *resultArray =
|
|
|
- GetOrCreateArrayIvarWithField(self, field, syntax);
|
|
|
+ GetOrCreateArrayIvarWithField(self, field);
|
|
|
[resultArray addRawValuesFromArray:otherArray];
|
|
|
} else {
|
|
|
// The array type doesn't matter, that all implement
|
|
|
// -addValuesFromArray:.
|
|
|
GPBInt32Array *resultArray =
|
|
|
- GetOrCreateArrayIvarWithField(self, field, syntax);
|
|
|
+ GetOrCreateArrayIvarWithField(self, field);
|
|
|
[resultArray addValuesFromArray:otherArray];
|
|
|
}
|
|
|
}
|
|
@@ -2571,19 +2559,19 @@ static void MergeRepeatedNotPackedFieldFromCodedInputStream(
|
|
|
if (GPBDataTypeIsObject(keyDataType) &&
|
|
|
GPBDataTypeIsObject(valueDataType)) {
|
|
|
NSMutableDictionary *resultDict =
|
|
|
- GetOrCreateMapIvarWithField(self, field, syntax);
|
|
|
+ GetOrCreateMapIvarWithField(self, field);
|
|
|
[resultDict addEntriesFromDictionary:otherDict];
|
|
|
} else if (valueDataType == GPBDataTypeEnum) {
|
|
|
// The exact type doesn't matter, just need to know it is a
|
|
|
// GPB*EnumDictionary.
|
|
|
GPBInt32EnumDictionary *resultDict =
|
|
|
- GetOrCreateMapIvarWithField(self, field, syntax);
|
|
|
+ GetOrCreateMapIvarWithField(self, field);
|
|
|
[resultDict addRawEntriesFromDictionary:otherDict];
|
|
|
} else {
|
|
|
// The exact type doesn't matter, they all implement
|
|
|
// -addEntriesFromDictionary:.
|
|
|
GPBInt32Int32Dictionary *resultDict =
|
|
|
- GetOrCreateMapIvarWithField(self, field, syntax);
|
|
|
+ GetOrCreateMapIvarWithField(self, field);
|
|
|
[resultDict addEntriesFromDictionary:otherDict];
|
|
|
}
|
|
|
}
|
|
@@ -3115,14 +3103,13 @@ static void ResolveIvarGet(__unsafe_unretained GPBFieldDescriptor *field,
|
|
|
|
|
|
// See comment about __unsafe_unretained on ResolveIvarGet.
|
|
|
static void ResolveIvarSet(__unsafe_unretained GPBFieldDescriptor *field,
|
|
|
- GPBFileSyntax syntax,
|
|
|
ResolveIvarAccessorMethodResult *result) {
|
|
|
GPBDataType fieldDataType = GPBGetFieldDataType(field);
|
|
|
switch (fieldDataType) {
|
|
|
#define CASE_SET(NAME, TYPE, TRUE_NAME) \
|
|
|
case GPBDataType##NAME: { \
|
|
|
result->impToAdd = imp_implementationWithBlock(^(id obj, TYPE value) { \
|
|
|
- return GPBSet##TRUE_NAME##IvarWithFieldInternal(obj, field, value, syntax); \
|
|
|
+ return GPBSet##TRUE_NAME##IvarWithFieldPrivate(obj, field, value); \
|
|
|
}); \
|
|
|
result->encodingSelector = @selector(set##NAME:); \
|
|
|
break; \
|
|
@@ -3130,7 +3117,7 @@ static void ResolveIvarSet(__unsafe_unretained GPBFieldDescriptor *field,
|
|
|
#define CASE_SET_COPY(NAME) \
|
|
|
case GPBDataType##NAME: { \
|
|
|
result->impToAdd = imp_implementationWithBlock(^(id obj, id value) { \
|
|
|
- return GPBSetRetainedObjectIvarWithFieldInternal(obj, field, [value copy], syntax); \
|
|
|
+ return GPBSetRetainedObjectIvarWithFieldPrivate(obj, field, [value copy]); \
|
|
|
}); \
|
|
|
result->encodingSelector = @selector(set##NAME:); \
|
|
|
break; \
|
|
@@ -3177,7 +3164,7 @@ static void ResolveIvarSet(__unsafe_unretained GPBFieldDescriptor *field,
|
|
|
ResolveIvarGet(field, &result);
|
|
|
break;
|
|
|
} else if (sel == field->setSel_) {
|
|
|
- ResolveIvarSet(field, descriptor.file.syntax, &result);
|
|
|
+ ResolveIvarSet(field, &result);
|
|
|
break;
|
|
|
} else if (sel == field->hasOrCountSel_) {
|
|
|
int32_t index = GPBFieldHasIndex(field);
|
|
@@ -3227,9 +3214,8 @@ static void ResolveIvarSet(__unsafe_unretained GPBFieldDescriptor *field,
|
|
|
} else if (sel == field->setSel_) {
|
|
|
// Local for syntax so the block can directly capture it and not the
|
|
|
// full lookup.
|
|
|
- const GPBFileSyntax syntax = descriptor.file.syntax;
|
|
|
result.impToAdd = imp_implementationWithBlock(^(id obj, id value) {
|
|
|
- GPBSetObjectIvarWithFieldInternal(obj, field, value, syntax);
|
|
|
+ GPBSetObjectIvarWithFieldPrivate(obj, field, value);
|
|
|
});
|
|
|
result.encodingSelector = @selector(setArray:);
|
|
|
break;
|
|
@@ -3334,9 +3320,7 @@ id GPBGetMessageRepeatedField(GPBMessage *self, GPBFieldDescriptor *field) {
|
|
|
[self class], field.name];
|
|
|
}
|
|
|
#endif
|
|
|
- GPBDescriptor *descriptor = [[self class] descriptor];
|
|
|
- GPBFileSyntax syntax = descriptor.file.syntax;
|
|
|
- return GetOrCreateArrayIvarWithField(self, field, syntax);
|
|
|
+ return GetOrCreateArrayIvarWithField(self, field);
|
|
|
}
|
|
|
|
|
|
// Only exists for public api, no core code should use this.
|
|
@@ -3348,9 +3332,7 @@ id GPBGetMessageMapField(GPBMessage *self, GPBFieldDescriptor *field) {
|
|
|
[self class], field.name];
|
|
|
}
|
|
|
#endif
|
|
|
- GPBDescriptor *descriptor = [[self class] descriptor];
|
|
|
- GPBFileSyntax syntax = descriptor.file.syntax;
|
|
|
- return GetOrCreateMapIvarWithField(self, field, syntax);
|
|
|
+ return GetOrCreateMapIvarWithField(self, field);
|
|
|
}
|
|
|
|
|
|
id GPBGetObjectIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
|