From 81f662a3dc5b7a297ec4932ac3068b245ca58999 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Thu, 21 Sep 2023 16:34:27 -0700 Subject: [PATCH] switch on return types for invokeObjCMethod instead of cascading if else (#39591) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39591 Changelog: [Internal] I'm refactoring this for a couple of reasons: 1) it isolates the void execution path, which we are changing now 2) switch case is safer than if else, in the future if we introduce new return types Differential Revision: D49521866 fbshipit-source-id: 6934ba2d94211d7d67ace0e4eefeb6268fcdee49 --- .../ios/ReactCommon/RCTTurboModule.mm | 59 +++++++++++-------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm index 61b7430fb23afc..c1ddba97c6651e 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm @@ -721,32 +721,43 @@ id convertJSIValueToObjCObject(jsi::Runtime &runtime, const jsi::Value &value, s jsi::Value returnValue = jsi::Value::undefined(); - if (returnType == PromiseKind) { - returnValue = createPromise( - runtime, methodNameStr, ^(RCTPromiseResolveBlock resolveBlock, RCTPromiseRejectBlock rejectBlock) { - RCTPromiseResolveBlock resolveCopy = [resolveBlock copy]; - RCTPromiseRejectBlock rejectCopy = [rejectBlock copy]; - - [inv setArgument:(void *)&resolveCopy atIndex:count + 2]; - [inv setArgument:(void *)&rejectCopy atIndex:count + 3]; - [retainedObjectsForInvocation addObject:resolveCopy]; - [retainedObjectsForInvocation addObject:rejectCopy]; - // The return type becomes void in the ObjC side. - performMethodInvocation(runtime, isSyncInvocation, methodName, inv, retainedObjectsForInvocation); - }); - } else { - id result = - performMethodInvocation(runtime, isSyncInvocation, methodName, inv, retainedObjectsForInvocation); - - if (isSyncInvocation) { - TurboModulePerfLogger::syncMethodCallReturnConversionStart(moduleName, methodName); + switch (returnType) { + case PromiseKind: { + returnValue = createPromise( + runtime, methodNameStr, ^(RCTPromiseResolveBlock resolveBlock, RCTPromiseRejectBlock rejectBlock) { + RCTPromiseResolveBlock resolveCopy = [resolveBlock copy]; + RCTPromiseRejectBlock rejectCopy = [rejectBlock copy]; + [inv setArgument:(void *)&resolveCopy atIndex:count + 2]; + [inv setArgument:(void *)&rejectCopy atIndex:count + 3]; + [retainedObjectsForInvocation addObject:resolveCopy]; + [retainedObjectsForInvocation addObject:rejectCopy]; + // The return type becomes void in the ObjC side. + performMethodInvocation(runtime, isSyncInvocation, methodName, inv, retainedObjectsForInvocation); + }); + break; } - - returnValue = convertReturnIdToJSIValue(runtime, methodName, returnType, result); - - if (isSyncInvocation) { - TurboModulePerfLogger::syncMethodCallReturnConversionEnd(moduleName, methodName); + case VoidKind: { + id result = performMethodInvocation(runtime, isSyncInvocation, methodName, inv, retainedObjectsForInvocation); + if (isSyncInvocation) { + TurboModulePerfLogger::syncMethodCallReturnConversionStart(moduleName, methodName); + } + returnValue = convertReturnIdToJSIValue(runtime, methodName, returnType, result); + if (isSyncInvocation) { + TurboModulePerfLogger::syncMethodCallReturnConversionEnd(moduleName, methodName); + } + break; } + case BooleanKind: + case NumberKind: + case StringKind: + case ObjectKind: + case ArrayKind: + case FunctionKind: { + id result = performMethodInvocation(runtime, true, methodName, inv, retainedObjectsForInvocation); + TurboModulePerfLogger::syncMethodCallReturnConversionStart(moduleName, methodName); + returnValue = convertReturnIdToJSIValue(runtime, methodName, returnType, result); + TurboModulePerfLogger::syncMethodCallReturnConversionEnd(moduleName, methodName); + } break; } if (isSyncInvocation) {