From 5b0957962a4c5cdba0b265edc4b5e7aa65388d10 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Thu, 10 Dec 2020 20:21:11 -0800 Subject: [PATCH] Attach RCTModuleRegistry to TurboModules Summary: Changelog: [Internal] Reviewed By: PeteTheHeat Differential Revision: D25414882 fbshipit-source-id: 9e45ffb86cf69a2d1921b7ff1c713c186a8c4e01 --- .../platform/ios/RCTTurboModuleManager.mm | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm index cd7ba02c51..8caf2a3fb9 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm @@ -172,6 +172,8 @@ static Class getFallbackClassFromName(const char *name) std::shared_timed_mutex _turboModuleHoldersSharedMutex; std::mutex _turboModuleHoldersMutex; std::atomic _invalidating; + + RCTModuleRegistry *_moduleRegistry; } - (instancetype)initWithBridge:(RCTBridge *)bridge @@ -183,6 +185,9 @@ static Class getFallbackClassFromName(const char *name) _delegate = delegate; _bridge = bridge; _invalidating = false; + _moduleRegistry = [RCTModuleRegistry new]; + [_moduleRegistry setBridge:bridge]; + [_moduleRegistry setTurboModuleRegistry:self]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bridgeWillInvalidateModules:) @@ -535,6 +540,25 @@ static Class getFallbackClassFromName(const char *name) } } + /** + * Attach the RCTModuleRegistry to this TurboModule, which allows this TurboModule + * To load other NativeModules & TurboModules. + * + * Usage: In the NativeModule @implementation, include: + * `@synthesize moduleRegistry = _moduleRegistry` + */ + if ([module respondsToSelector:@selector(moduleRegistry)] && _moduleRegistry) { + @try { + [(id)module setValue:_moduleRegistry forKey:@"moduleRegistry"]; + } @catch (NSException *exception) { + RCTLogError( + @"%@ has no setter or ivar for its module registry, which is not " + "permitted. You must either @synthesize the moduleRegistry property, " + "or provide your own setter method.", + RCTBridgeModuleNameForClass([module class])); + } + } + /** * Some modules need their own queues, but don't provide any, so we need to create it for them. * These modules typically have the following: