Index: third_party/protobuf/objectivec/GPBExtensionRegistry.m |
diff --git a/third_party/protobuf/objectivec/GPBExtensionRegistry.m b/third_party/protobuf/objectivec/GPBExtensionRegistry.m |
index 65534b67af1692689cea292e65dc5f8ce577764a..df61a17b187ab1d21894e0da8e4b33939491e935 100644 |
--- a/third_party/protobuf/objectivec/GPBExtensionRegistry.m |
+++ b/third_party/protobuf/objectivec/GPBExtensionRegistry.m |
@@ -34,6 +34,8 @@ |
#import "GPBDescriptor.h" |
@implementation GPBExtensionRegistry { |
+ // TODO(dmaclach): Reimplement with CFDictionaries that don't use |
+ // objects as keys. |
NSMutableDictionary *mutableClassMap_; |
} |
@@ -49,12 +51,6 @@ |
[super dealloc]; |
} |
-// Direct access is use for speed, to avoid even internally declaring things |
-// read/write, etc. The warning is enabled in the project to ensure code calling |
-// protos can turn on -Wdirect-ivar-access without issues. |
-#pragma clang diagnostic push |
-#pragma clang diagnostic ignored "-Wdirect-ivar-access" |
- |
- (instancetype)copyWithZone:(NSZone *)zone { |
GPBExtensionRegistry *result = [[[self class] allocWithZone:zone] init]; |
if (result && mutableClassMap_.count) { |
@@ -63,16 +59,13 @@ |
return result; |
} |
-- (CFMutableDictionaryRef)extensionMapForContainingMessageClass: |
+- (NSMutableDictionary *)extensionMapForContainingMessageClass: |
(Class)containingMessageClass { |
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef) |
+ NSMutableDictionary *extensionMap = |
[mutableClassMap_ objectForKey:containingMessageClass]; |
if (extensionMap == nil) { |
- // Use a custom dictionary here because the keys are numbers and conversion |
- // back and forth from NSNumber isn't worth the cost. |
- extensionMap = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, |
- &kCFTypeDictionaryValueCallBacks); |
- [mutableClassMap_ setObject:(id)extensionMap |
+ extensionMap = [NSMutableDictionary dictionary]; |
+ [mutableClassMap_ setObject:extensionMap |
forKey:(id<NSCopying>)containingMessageClass]; |
} |
return extensionMap; |
@@ -84,28 +77,17 @@ |
} |
Class containingMessageClass = extension.containingMessageClass; |
- CFMutableDictionaryRef extensionMap = |
+ NSMutableDictionary *extensionMap = |
[self extensionMapForContainingMessageClass:containingMessageClass]; |
- ssize_t key = extension.fieldNumber; |
- CFDictionarySetValue(extensionMap, (const void *)key, extension); |
+ [extensionMap setObject:extension forKey:@(extension.fieldNumber)]; |
} |
- (GPBExtensionDescriptor *)extensionForDescriptor:(GPBDescriptor *)descriptor |
fieldNumber:(NSInteger)fieldNumber { |
Class messageClass = descriptor.messageClass; |
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef) |
+ NSDictionary *extensionMap = |
[mutableClassMap_ objectForKey:messageClass]; |
- ssize_t key = fieldNumber; |
- GPBExtensionDescriptor *result = |
- (extensionMap |
- ? CFDictionaryGetValue(extensionMap, (const void *)key) |
- : nil); |
- return result; |
-} |
- |
-static void CopyKeyValue(const void *key, const void *value, void *context) { |
- CFMutableDictionaryRef extensionMap = (CFMutableDictionaryRef)context; |
- CFDictionarySetValue(extensionMap, key, value); |
+ return [extensionMap objectForKey:@(fieldNumber)]; |
} |
- (void)addExtensions:(GPBExtensionRegistry *)registry { |
@@ -114,18 +96,13 @@ static void CopyKeyValue(const void *key, const void *value, void *context) { |
return; |
} |
NSMutableDictionary *otherClassMap = registry->mutableClassMap_; |
- [otherClassMap enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL * stop) { |
-#pragma unused(stop) |
- Class containingMessageClass = key; |
- CFMutableDictionaryRef otherExtensionMap = (CFMutableDictionaryRef)value; |
- |
- CFMutableDictionaryRef extensionMap = |
+ for (Class containingMessageClass in otherClassMap) { |
+ NSMutableDictionary *extensionMap = |
[self extensionMapForContainingMessageClass:containingMessageClass]; |
- |
- CFDictionaryApplyFunction(otherExtensionMap, CopyKeyValue, extensionMap); |
- }]; |
+ NSMutableDictionary *otherExtensionMap = |
+ [registry extensionMapForContainingMessageClass:containingMessageClass]; |
+ [extensionMap addEntriesFromDictionary:otherExtensionMap]; |
+ } |
} |
-#pragma clang diagnostic pop |
- |
@end |