From 694bf7104ca36edf318a89c7242fc6c84dfebd73 Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Tue, 30 Apr 2019 13:55:25 -0700 Subject: [PATCH] TM iOS optimization: codegen @selector for each method call. Summary: This adds support for specifying the exact selector name for each exposed ObjC method. This allows us to avoid dynamic method lookup every time a method is called from JS. Reviewed By: RSNara Differential Revision: D15141611 fbshipit-source-id: ed2820782ab013369e4e1f22dbce31d9838a17bb --- .../core/platform/ios/RCTTurboModule.h | 8 +++++ .../core/platform/ios/RCTTurboModule.mm | 11 +++++++ .../ios/RCTNativeSampleTurboModuleSpec.mm | 31 +++++++++++++------ 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.h b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.h index dbd31c8f4..6cbc3a42e 100644 --- a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.h +++ b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.h @@ -40,6 +40,14 @@ public: const jsi::Value *args, size_t count) override; + jsi::Value invokeObjCMethod( + jsi::Runtime &runtime, + TurboModuleMethodValueKind valueKind, + const std::string &methodName, + SEL selector, + const jsi::Value *args, + size_t count); + id instance_; protected: void setMethodArgConversionSelector(NSString *methodName, int argIndex, NSString *fnName); diff --git a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm index 505f21643..6b594ef03 100644 --- a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm +++ b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModule.mm @@ -596,6 +596,17 @@ jsi::Value ObjCTurboModule::invokeMethod( const jsi::Value *args, size_t count) { SEL selector = resolveMethodSelector(valueKind, instance_, name_, methodName, count); + return invokeObjCMethod(runtime, valueKind, methodName, selector, args, count); +} + +jsi::Value ObjCTurboModule::invokeObjCMethod( + jsi::Runtime &runtime, + TurboModuleMethodValueKind valueKind, + const std::string &methodName, + SEL selector, + const jsi::Value *args, + size_t count) +{ NSMutableArray *retainedObjectsForInvocation = [NSMutableArray new]; NSInvocation *inv = getMethodInvocation(runtime, valueKind, instance_, jsInvoker_, methodName, selector, args, count, retainedObjectsForInvocation); diff --git a/ReactCommon/turbomodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm b/ReactCommon/turbomodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm index 088383718..66d6c0842 100644 --- a/ReactCommon/turbomodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm +++ b/ReactCommon/turbomodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm @@ -13,43 +13,54 @@ namespace facebook { namespace react { static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, VoidKind, "voidFunc", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, VoidKind, "voidFunc", @selector(voidFunc), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getBool(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, BooleanKind, "getBool", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, BooleanKind, "getBool", @selector(getBool:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getNumber(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, NumberKind, "getNumber", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, NumberKind, "getNumber", @selector(getNumber:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getString(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, StringKind, "getString", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, StringKind, "getString", @selector(getString:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getArray(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, ArrayKind, "getArray", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, ArrayKind, "getArray", @selector(getArray:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getObject(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, ObjectKind, "getObject", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, ObjectKind, "getObject", @selector(getObject:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getValue(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, ObjectKind, "getValue", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, ObjectKind, "getValue", @selector(getValue:y:z:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getValueWithCallback(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, VoidKind, "getValueWithCallback", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, VoidKind, "getValueWithCallback", @selector(getValueWithCallback:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getValueWithPromise(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, PromiseKind, "getValueWithPromise", args, count); + return static_cast(turboModule) + .invokeObjCMethod( + rt, PromiseKind, "getValueWithPromise", @selector(getValueWithPromise:resolve:reject:), args, count); } static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getConstants(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { - return turboModule.invokeMethod(rt, ObjectKind, "getConstants", args, count); + return static_cast(turboModule) + .invokeObjCMethod(rt, ObjectKind, "getConstants", @selector(getConstants), args, count); } NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(id instance, std::shared_ptr jsInvoker)