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 df3b0689026..e5106e639d5 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 @@ -56,20 +56,30 @@ void TurboModuleManager::installJSIBindings() { } TurboModuleBinding::install(*runtime_, std::make_shared( [this](const std::string &name) -> std::shared_ptr { + auto turboModuleLookup = turboModuleCache_.find(name); + if (turboModuleLookup != turboModuleCache_.end()) { + return turboModuleLookup->second; + } + auto cxxModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, jsCallInvoker_); if (cxxModule) { + turboModuleCache_.insert({name, cxxModule}); return cxxModule; } auto legacyCxxModule = getLegacyCxxJavaModule(name); if (legacyCxxModule) { - return std::make_shared(legacyCxxModule->cthis()->getModule(), jsCallInvoker_); + auto turboModule = std::make_shared(legacyCxxModule->cthis()->getModule(), jsCallInvoker_); + turboModuleCache_.insert({name, turboModule}); + return turboModule; } auto moduleInstance = getJavaModule(name); if (moduleInstance) { - return turboModuleManagerDelegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_); + auto turboModule = turboModuleManagerDelegate_->cthis()->getTurboModule(name, moduleInstance, jsCallInvoker_); + turboModuleCache_.insert({name, turboModule}); + return turboModule; } return std::shared_ptr(nullptr); diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.h b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.h index ce2e2345baa..269b2da367c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.h +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.h @@ -8,6 +8,7 @@ #pragma once #include +#include #include #include #include @@ -37,6 +38,14 @@ private: std::shared_ptr jsCallInvoker_; jni::global_ref turboModuleManagerDelegate_; + /** + * TODO(T48018690): + * All modules are currently long-lived. + * We need to come up with a mechanism to allow modules to specify whether + * they want to be long-lived or short-lived. + */ + std::unordered_map> turboModuleCache_; + jni::global_ref getJavaModule(std::string name); jni::global_ref getLegacyCxxJavaModule(std::string name); void installJSIBindings(); diff --git a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm index 15d52a504e4..3cb73b54c01 100644 --- a/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm @@ -40,7 +40,7 @@ static Class getFallbackClassFromName(const char *name) __weak id _delegate; __weak RCTBridge *_bridge; /** - * TODO(rsnara): + * TODO(T48018690): * All modules are currently long-lived. * We need to come up with a mechanism to allow modules to specify whether * they want to be long-lived or short-lived.