From 78e42eb951bdf7a3be5e1b6dfad6c7651cf9ffb6 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Tue, 3 Oct 2023 11:14:38 -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 Reviewed By: RSNara Differential Revision: D49521866 fbshipit-source-id: 3ef1458f308510be7a69b733099b70ae821e26df --- .../ios/ReactCommon/RCTTurboModule.mm | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 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 6717b9dc5eb93d..2d6aa7df8b61a0 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 @@ -725,31 +725,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) {