@@ -306,6 +306,57 @@ static void CheckExtension(GPBMessage *self, GPBExtensionDescriptor *extension)
306306 }
307307}
308308
309+ #if defined(DEBUG) && DEBUG
310+ static void CheckExtensionValue (GPBExtensionDescriptor *extension, id value) {
311+ // If asserts are stripped, value is unused.
312+ (void )value;
313+ switch (extension.dataType ) {
314+ case GPBDataTypeBool:
315+ case GPBDataTypeFixed32:
316+ case GPBDataTypeSFixed32:
317+ case GPBDataTypeFloat:
318+ case GPBDataTypeFixed64:
319+ case GPBDataTypeSFixed64:
320+ case GPBDataTypeDouble:
321+ case GPBDataTypeInt32:
322+ case GPBDataTypeInt64:
323+ case GPBDataTypeSInt32:
324+ case GPBDataTypeSInt64:
325+ case GPBDataTypeUInt32:
326+ case GPBDataTypeUInt64:
327+ NSCAssert ([value isKindOfClass: [NSNumber class ]],
328+ @" Extension %@ value must be an NSNumber (was %@ )" , extension.singletonName,
329+ [value class ]);
330+ break ;
331+ case GPBDataTypeEnum:
332+ NSCAssert ([value isKindOfClass: [NSNumber class ]],
333+ @" Extension %@ value must be an NSNumber (was %@ )" , extension.singletonName,
334+ [value class ]);
335+ NSCAssert (!extension.enumDescriptor.isClosed ||
336+ extension.enumDescriptor.enumVerifier([value intValue ]),
337+ @"Extension %@ has value %d which is not a valid %@", extension.singletonName,
338+ [value intValue], extension.enumDescriptor.name);
339+ break ;
340+ case GPBDataTypeBytes:
341+ NSCAssert ([value isKindOfClass: [NSData class ]],
342+ @" Extension %@ value must be of type NSData (was %@ )" , extension.singletonName,
343+ [value class ]);
344+ break ;
345+ case GPBDataTypeString:
346+ NSCAssert ([value isKindOfClass: [NSString class ]],
347+ @" Extension %@ value must be of type NSString (was %@ )" , extension.singletonName,
348+ [value class ]);
349+ break ;
350+ case GPBDataTypeMessage:
351+ case GPBDataTypeGroup:
352+ NSCAssert ([value isKindOfClass: extension.msgClass],
353+ @" Extension %@ value must be of type %@ (was %@ )" , extension.singletonName,
354+ extension.msgClass, [value class ]);
355+ break ;
356+ }
357+ }
358+ #endif
359+
309360static NSMutableDictionary *CloneExtensionMap (NSDictionary *extensionMap, NSZone *zone) {
310361 if (extensionMap.count == 0 ) {
311362 return nil ;
@@ -2151,6 +2202,9 @@ - (void)setExtension:(GPBExtensionDescriptor *)extension value:(id)value {
21512202 }
21522203
21532204 CheckExtension (self, extension);
2205+ #if defined(DEBUG) && DEBUG
2206+ CheckExtensionValue (extension, value);
2207+ #endif
21542208
21552209 if (extension.repeated ) {
21562210 [NSException raise: NSInvalidArgumentException
@@ -2184,6 +2238,9 @@ - (void)setExtension:(GPBExtensionDescriptor *)extension value:(id)value {
21842238
21852239- (void )addExtension:(GPBExtensionDescriptor *)extension value:(id )value {
21862240 CheckExtension (self, extension);
2241+ #if defined(DEBUG) && DEBUG
2242+ CheckExtensionValue (extension, value);
2243+ #endif
21872244
21882245 if (!extension.repeated ) {
21892246 [NSException raise: NSInvalidArgumentException
@@ -2205,6 +2262,9 @@ - (void)addExtension:(GPBExtensionDescriptor *)extension value:(id)value {
22052262
22062263- (void )setExtension:(GPBExtensionDescriptor *)extension index:(NSUInteger )idx value:(id )value {
22072264 CheckExtension (self, extension);
2265+ #if defined(DEBUG) && DEBUG
2266+ CheckExtensionValue (extension, value);
2267+ #endif
22082268
22092269 if (!extension.repeated ) {
22102270 [NSException raise: NSInvalidArgumentException
0 commit comments