diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.cpp b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.cpp index 3097d8da52f..04238f8eb8f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.cpp @@ -169,12 +169,8 @@ void TurboModuleManager::installJSIBindings() { return nullptr; }; - if (longLivedObjectCollection_) { - TurboModuleBinding::install( - runtime, std::move(turboModuleProvider), longLivedObjectCollection_); - } else { - TurboModuleBinding::install(runtime, std::move(turboModuleProvider)); - } + TurboModuleBinding::install( + runtime, std::move(turboModuleProvider), longLivedObjectCollection_); }); } diff --git a/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h b/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h index 4ca5b5c77f6..a55b8bec9ff 100644 --- a/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h +++ b/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h @@ -32,6 +32,8 @@ enum TurboModuleMethodValueKind { PromiseKind, }; +class TurboModuleBinding; + /** * Base HostObject class for every module to be exposed to JS */ @@ -39,25 +41,30 @@ class JSI_EXPORT TurboModule : public facebook::jsi::HostObject { public: TurboModule(std::string name, std::shared_ptr jsInvoker); - virtual facebook::jsi::Value get( + // Note: keep this method declared inline to avoid conflicts + // between RTTI and non-RTTI compilation units + facebook::jsi::Value get( facebook::jsi::Runtime &runtime, const facebook::jsi::PropNameID &propName) override { - std::string propNameUtf8 = propName.utf8(runtime); - auto p = methodMap_.find(propNameUtf8); - if (p == methodMap_.end()) { - // Method was not found, let JS decide what to do. - return jsi::Value::undefined(); + { + std::string propNameUtf8 = propName.utf8(runtime); + auto p = methodMap_.find(propNameUtf8); + if (p == methodMap_.end()) { + // Method was not found, let JS decide what to do. + return facebook::jsi::Value::undefined(); + } else { + MethodMetadata meta = p->second; + return facebook::jsi::Function::createFromHostFunction( + runtime, + propName, + static_cast(meta.argCount), + [this, meta]( + jsi::Runtime &rt, + const jsi::Value &thisVal, + const jsi::Value *args, + size_t count) { return meta.invoker(rt, *this, args, count); }); + } } - MethodMetadata meta = p->second; - return jsi::Function::createFromHostFunction( - runtime, - propName, - static_cast(meta.argCount), - [this, meta]( - facebook::jsi::Runtime &rt, - const facebook::jsi::Value &thisVal, - const facebook::jsi::Value *args, - size_t count) { return meta.invoker(rt, *this, args, count); }); } const std::string name_; diff --git a/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp b/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp index 61c21a076e9..d24ef17707e 100644 --- a/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp +++ b/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp @@ -22,41 +22,11 @@ namespace react { * Public API to install the TurboModule system. */ -TurboModuleBinding::TurboModuleBinding( - const TurboModuleProviderFunctionType &&moduleProvider) - : moduleProvider_(std::move(moduleProvider)), - longLivedObjectCollection_(nullptr), - disableGlobalLongLivedObjectCollection_(false) {} - TurboModuleBinding::TurboModuleBinding( const TurboModuleProviderFunctionType &&moduleProvider, std::shared_ptr longLivedObjectCollection) : moduleProvider_(std::move(moduleProvider)), - longLivedObjectCollection_(longLivedObjectCollection), - disableGlobalLongLivedObjectCollection_(true) {} - -void TurboModuleBinding::install( - jsi::Runtime &runtime, - const TurboModuleProviderFunctionType &&moduleProvider) { - runtime.global().setProperty( - runtime, - "__turboModuleProxy", - jsi::Function::createFromHostFunction( - runtime, - jsi::PropNameID::forAscii(runtime, "__turboModuleProxy"), - 1, - - // Create a TurboModuleBinding that uses the global - // LongLivedObjectCollection - [binding = - std::make_shared(std::move(moduleProvider))]( - jsi::Runtime &rt, - const jsi::Value &thisVal, - const jsi::Value *args, - size_t count) { - return binding->jsProxy(rt, thisVal, args, count); - })); -} + longLivedObjectCollection_(std::move(longLivedObjectCollection)) {} void TurboModuleBinding::install( jsi::Runtime &runtime, @@ -69,42 +39,26 @@ void TurboModuleBinding::install( runtime, jsi::PropNameID::forAscii(runtime, "__turboModuleProxy"), 1, - // Create a TurboModuleBinding that doesn't use the global - // LongLivedObjectCollection - [binding = std::make_shared( - std::move(moduleProvider), longLivedObjectCollection)]( + [binding = TurboModuleBinding( + std::move(moduleProvider), + std::move(longLivedObjectCollection))]( jsi::Runtime &rt, const jsi::Value &thisVal, const jsi::Value *args, - size_t count) { - return binding->jsProxy(rt, thisVal, args, count); + size_t count) mutable { + return binding.getModule(rt, thisVal, args, count); })); } TurboModuleBinding::~TurboModuleBinding() { - if (longLivedObjectCollection_ != nullptr) { + if (longLivedObjectCollection_) { longLivedObjectCollection_->clear(); - return; + } else { + LongLivedObjectCollection::get().clear(); } - - if (disableGlobalLongLivedObjectCollection_) { - return; - } - - LongLivedObjectCollection::get().clear(); } -std::shared_ptr TurboModuleBinding::getModule( - const std::string &name) { - std::shared_ptr module = nullptr; - { - SystraceSection s("TurboModuleBinding::getModule", "module", name); - module = moduleProvider_(name); - } - return module; -} - -jsi::Value TurboModuleBinding::jsProxy( +jsi::Value TurboModuleBinding::getModule( jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *args, @@ -114,14 +68,18 @@ jsi::Value TurboModuleBinding::jsProxy( "__turboModuleProxy must be called with at least 1 argument"); } std::string moduleName = args[0].getString(runtime).utf8(runtime); - jsi::Value nullSchema = jsi::Value::undefined(); - std::shared_ptr module = getModule(moduleName); - if (module == nullptr) { + std::shared_ptr module; + { + SystraceSection s( + "TurboModuleBinding::moduleProvider", "module", moduleName); + module = moduleProvider_(moduleName); + } + if (module) { + return jsi::Object::createFromHostObject(runtime, std::move(module)); + } else { return jsi::Value::null(); } - - return jsi::Object::createFromHostObject(runtime, std::move(module)); } } // namespace react diff --git a/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h b/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h index 148d4d24f07..8d7742f3ff0 100644 --- a/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h +++ b/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h @@ -27,31 +27,22 @@ class TurboModuleBinding { * Installs TurboModuleBinding into JavaScript runtime. * Thread synchronization must be enforced externally. */ - static void install( - jsi::Runtime &runtime, - const TurboModuleProviderFunctionType &&moduleProvider); static void install( jsi::Runtime &runtime, const TurboModuleProviderFunctionType &&moduleProvider, std::shared_ptr longLivedObjectCollection); - TurboModuleBinding(const TurboModuleProviderFunctionType &&moduleProvider); + private: TurboModuleBinding( const TurboModuleProviderFunctionType &&moduleProvider, std::shared_ptr longLivedObjectCollection); virtual ~TurboModuleBinding(); - /** - * Get an TurboModule instance for the given module name. - */ - std::shared_ptr getModule(const std::string &name); - - private: /** * A lookup function exposed to JS to get an instance of a TurboModule * for the given name. */ - jsi::Value jsProxy( + jsi::Value getModule( jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *args, @@ -59,7 +50,6 @@ class TurboModuleBinding { TurboModuleProviderFunctionType moduleProvider_; std::shared_ptr longLivedObjectCollection_; - bool disableGlobalLongLivedObjectCollection_; }; } // namespace react diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm index 6dfc6cb249c..e58ce0dc126 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm @@ -776,7 +776,7 @@ static Class getFallbackClassFromName(const char *name) if (RCTGetTurboModuleCleanupMode() == kRCTGlobalScope || RCTGetTurboModuleCleanupMode() == kRCTGlobalScopeUsingRetainJSCallback) { runtimeExecutor([turboModuleProvider = std::move(turboModuleProvider)](jsi::Runtime &runtime) { - react::TurboModuleBinding::install(runtime, std::move(turboModuleProvider)); + react::TurboModuleBinding::install(runtime, std::move(turboModuleProvider), nullptr); }); } else if (RCTGetTurboModuleCleanupMode() == kRCTTurboModuleManagerScope) { runtimeExecutor([turboModuleProvider = std::move(turboModuleProvider),