From c0bf53b7165ab6b48b853b3eebda9593f347fcdf Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Mon, 10 Jun 2019 18:37:57 -0700 Subject: [PATCH] TM iOS: attempt to convert number args using RCTConvert as well Summary: Some native modules methods expects number-based args like `NSDate`. For backward compatibility, the incoming numbers should be converted using RCTConvert, just like object args. Reviewed By: mdvacca Differential Revision: D15748968 fbshipit-source-id: 4db2cb0c41eda1bbe8cde7b0365d9c3d675f5fb5 --- .../core/platform/ios/RCTTurboModule.mm | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm index f2862d60d71..ce6c7616788 100644 --- a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm +++ b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm @@ -460,6 +460,29 @@ NSInvocation *ObjCTurboModule::getMethodInvocation( */ if (objCArgType[0] == _C_ID) { id objCArg = [NSNumber numberWithDouble:v]; + NSString *methodNameNSString = @(methodName.c_str()); + + /** + * Convert numbers using RCTConvert if possible. + */ + NSString *argumentType = getArgumentTypeName(methodNameNSString, i); + if (argumentType != nil) { + NSString *rctConvertMethodName = [NSString stringWithFormat:@"%@:", argumentType]; + SEL rctConvertSelector = NSSelectorFromString(rctConvertMethodName); + + if ([RCTConvert respondsToSelector:rctConvertSelector]) { + // Message dispatch logic from old infra + id (*convert)(id, SEL, id) = (__typeof__(convert))objc_msgSend; + id convertedObjCArg = convert([RCTConvert class], rctConvertSelector, objCArg); + + [inv setArgument:(void *)&convertedObjCArg atIndex:i + 2]; + if (convertedObjCArg) { + [retainedObjectsForInvocation addObject:convertedObjCArg]; + } + continue; + } + } + [inv setArgument:(void *)&objCArg atIndex:i + 2]; [retainedObjectsForInvocation addObject:objCArg]; } else { @@ -486,7 +509,7 @@ NSInvocation *ObjCTurboModule::getMethodInvocation( NSString *rctConvertMethodName = [NSString stringWithFormat:@"%@:", argumentType]; SEL rctConvertSelector = NSSelectorFromString(rctConvertMethodName); - if ([RCTConvert respondsToSelector: rctConvertSelector]) { + if ([RCTConvert respondsToSelector:rctConvertSelector]) { // Message dispatch logic from old infra id (*convert)(id, SEL, id) = (__typeof__(convert))objc_msgSend; id convertedObjCArg = convert([RCTConvert class], rctConvertSelector, objCArg);