diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm index e9321dd82120..b68fc03360df 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppDelegate.mm @@ -25,9 +25,9 @@ #import #if USE_HERMES #import -#else +#elif USE_THIRD_PARTY_JSC != 1 #import -#endif +#endif // USE_HERMES #import using namespace facebook::react; diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h index 84d6219a5995..9813762ff397 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h +++ b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.h @@ -19,10 +19,11 @@ #elif __has_include() #import #endif -#else // USE_HERMES +#elif USE_THIRD_PARTY_JSC != 1 #import #endif // USE_HERMES +#import #import @protocol RCTDependencyProvider; diff --git a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm index e075d4d36425..21f007dba4e0 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTAppSetupUtils.mm @@ -130,38 +130,47 @@ void RCTAppSetupPrepareApp(UIApplication *application, BOOL turboModuleEnabled) [turboModuleManager moduleForName:"RCTDevMenu"]; #endif // end RCT_DEV + auto runtimeInstallerLambda = [turboModuleManager, bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) { + if (!bridge || !turboModuleManager) { + return; + } + if (runtimeScheduler) { + facebook::react::RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, runtimeScheduler); + } + [turboModuleManager installJSBindings:runtime]; + }; #if USE_HERMES return std::make_unique( -#else + facebook::react::RCTJSIExecutorRuntimeInstaller(runtimeInstallerLambda)); +#elif USE_THIRD_PARTY_JSC != 1 return std::make_unique( + facebook::react::RCTJSIExecutorRuntimeInstaller(runtimeInstallerLambda)); +#else + throw std::runtime_error("No JSExecutorFactory specified."); + return nullptr; #endif // USE_HERMES - facebook::react::RCTJSIExecutorRuntimeInstaller( - [turboModuleManager, bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) { - if (!bridge || !turboModuleManager) { - return; - } - if (runtimeScheduler) { - facebook::react::RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, runtimeScheduler); - } - [turboModuleManager installJSBindings:runtime]; - })); } std::unique_ptr RCTAppSetupJsExecutorFactoryForOldArch( RCTBridge *bridge, const std::shared_ptr &runtimeScheduler) { + auto runtimeInstallerLambda = [bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) { + if (!bridge) { + return; + } + if (runtimeScheduler) { + facebook::react::RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, runtimeScheduler); + } + }; #if USE_HERMES return std::make_unique( -#else + facebook::react::RCTJSIExecutorRuntimeInstaller(runtimeInstallerLambda)); +#elif USE_THIRD_PARTY_JSC != 1 return std::make_unique( + facebook::react::RCTJSIExecutorRuntimeInstaller(runtimeInstallerLambda)); +#else + throw std::runtime_error("No JSExecutorFactory specified."); + return nullptr; #endif // USE_HERMES - facebook::react::RCTJSIExecutorRuntimeInstaller([bridge, runtimeScheduler](facebook::jsi::Runtime &runtime) { - if (!bridge) { - return; - } - if (runtimeScheduler) { - facebook::react::RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, runtimeScheduler); - } - })); } diff --git a/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm b/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm index 4f2023298077..7589a0eb98a3 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTReactNativeFactory.mm @@ -27,9 +27,9 @@ #import #if USE_HERMES #import -#else +#elif USE_THIRD_PARTY_JSC != 1 #import -#endif +#endif // USE_HERMES #import #import "RCTDependencyProvider.h" diff --git a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm index 054540765eb5..a8f3644b22c7 100644 --- a/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm +++ b/packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm @@ -28,9 +28,10 @@ #import #if USE_HERMES #import -#else +#elif USE_THIRD_PARTY_JSC != 1 #import -#endif +#else +#endif // USE_HERMES #import #import #import @@ -265,8 +266,10 @@ - (RCTHost *)createReactHost:(NSDictionary *)launchOptions { #if USE_HERMES return std::make_shared(nullptr, /* allocInOldGenBeforeTTI */ false); -#else +#elif USE_THIRD_PARTY_JSC != 1 return std::make_shared(); +#else + throw std::runtime_error("No JSRuntimeFactory specified."); #endif } diff --git a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec index f41d858407bb..d106ec6e63c8 100644 --- a/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec +++ b/packages/react-native/Libraries/AppDelegate/React-RCTAppDelegate.podspec @@ -25,7 +25,8 @@ use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == '1' new_arch_enabled_flag = (is_new_arch_enabled ? " -DRCT_NEW_ARCH_ENABLED=1" : "") hermes_flag = (use_hermes ? " -DUSE_HERMES=1" : "") -other_cflags = "$(inherited) " + folly_compiler_flags + new_arch_enabled_flag + hermes_flag +use_third_party_jsc_flag = ENV['USE_THIRD_PARTY_JSC'] == '1' ? " -DUSE_THIRD_PARTY_JSC=1" : "" +other_cflags = "$(inherited) " + folly_compiler_flags + new_arch_enabled_flag + hermes_flag + use_third_party_jsc_flag header_search_paths = [ "$(PODS_TARGET_SRCROOT)/../../ReactCommon", diff --git a/packages/react-native/React-Core.podspec b/packages/react-native/React-Core.podspec index 615a33859d3b..0ee904bcea19 100644 --- a/packages/react-native/React-Core.podspec +++ b/packages/react-native/React-Core.podspec @@ -28,6 +28,7 @@ boost_compiler_flags = boost_config[:compiler_flags] use_hermes = ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == '1' use_hermes_flag = use_hermes ? "-DUSE_HERMES=1" : "" +use_third_party_jsc_flag = ENV['USE_THIRD_PARTY_JSC'] == '1' ? "-DUSE_THIRD_PARTY_JSC=1" : "" header_subspecs = { 'CoreModulesHeaders' => 'React/CoreModules/**/*.h', @@ -70,7 +71,7 @@ Pod::Spec.new do |s| s.platforms = min_supported_versions s.source = source s.resource_bundle = { "RCTI18nStrings" => ["React/I18n/strings/*.lproj"]} - s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + ' ' + use_hermes_flag + s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + ' ' + use_hermes_flag + ' ' + use_third_party_jsc_flag s.header_dir = "React" s.weak_framework = "JavaScriptCore" s.pod_target_xcconfig = { @@ -95,7 +96,7 @@ Pod::Spec.new do |s| ] # If we are using Hermes (the default is use hermes, so USE_HERMES can be nil), we don't have jsc installed # So we have to exclude the JSCExecutorFactory - if use_hermes + if use_hermes || ENV['USE_THIRD_PARTY_JSC'] == '1' exclude_files = exclude_files.append("React/CxxBridge/JSCExecutorFactory.{h,mm}") end ss.exclude_files = exclude_files diff --git a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm index c4966bfa3069..70faeae0acd7 100644 --- a/packages/react-native/React/CxxBridge/RCTCxxBridge.mm +++ b/packages/react-native/React/CxxBridge/RCTCxxBridge.mm @@ -47,7 +47,7 @@ #if USE_HERMES #import -#else +#elif USE_THIRD_PARTY_JSC != 1 #import "JSCExecutorFactory.h" #endif #import "RCTJSIExecutorRuntimeInstaller.h" @@ -440,8 +440,10 @@ - (void)start auto installBindings = RCTJSIExecutorRuntimeInstaller(nullptr); #if USE_HERMES executorFactory = std::make_shared(installBindings); -#else +#elif USE_THIRD_PARTY_JSC != 1 executorFactory = std::make_shared(installBindings); +#else + throw std::runtime_error("No JSExecutorFactory specified."); #endif } } else { diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec b/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec index 7bf217816fa7..7c8b55cf1b3a 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec @@ -77,6 +77,8 @@ Pod::Spec.new do |s| s.dependency "hermes-engine" s.dependency "React-RuntimeHermes" s.exclude_files = "ReactCommon/RCTJscInstance.{mm,h}" + elsif ENV['USE_THIRD_PARTY_JSC'] == '1' + s.exclude_files = ["ReactCommon/RCTHermesInstance.{mm,h}", "ReactCommon/RCTJscInstance.{mm,h}"] else s.dependency "React-jsc" s.exclude_files = "ReactCommon/RCTHermesInstance.{mm,h}" diff --git a/packages/react-native/scripts/cocoapods/__tests__/jsengine-test.rb b/packages/react-native/scripts/cocoapods/__tests__/jsengine-test.rb index 94a8f3957490..c3e4d571d59a 100644 --- a/packages/react-native/scripts/cocoapods/__tests__/jsengine-test.rb +++ b/packages/react-native/scripts/cocoapods/__tests__/jsengine-test.rb @@ -21,6 +21,7 @@ def setup def teardown ENV['HERMES_ENGINE_TARBALL_PATH'] = nil + ENV['USE_THIRD_PARTY_JSC'] = nil Open3.reset() Pod::Config.reset() Pod::UI.reset() @@ -59,6 +60,19 @@ def test_setupJsc_installsPods_installsFabricSubspecWhenFabricEnabled assert_equal($podInvocation["React-jsc/Fabric"][:path], "../../ReactCommon/jsc") end + def test_setupJsc_installsPodsWithThirdPartyJSC + # Arrange + ENV['USE_THIRD_PARTY_JSC'] = '1' + fabric_enabled = false + + # Act + setup_jsc!(:react_native_path => @react_native_path, :fabric_enabled => fabric_enabled) + + # Assert + assert_equal($podInvocationCount, 1) + assert_equal($podInvocation["React-jsi"][:path], "../../ReactCommon/jsi") + end + # ================== # # TEST - setupHermes # # ================== # diff --git a/packages/react-native/scripts/cocoapods/jsengine.rb b/packages/react-native/scripts/cocoapods/jsengine.rb index 922164947962..0784f4b093a2 100644 --- a/packages/react-native/scripts/cocoapods/jsengine.rb +++ b/packages/react-native/scripts/cocoapods/jsengine.rb @@ -10,9 +10,11 @@ # @parameter react_native_path: relative path to react-native # @parameter fabric_enabled: whether Fabirc is enabled def setup_jsc!(react_native_path: "../node_modules/react-native", fabric_enabled: false) - pod 'React-jsc', :path => "#{react_native_path}/ReactCommon/jsc" - if fabric_enabled - pod 'React-jsc/Fabric', :path => "#{react_native_path}/ReactCommon/jsc" + if ENV['USE_THIRD_PARTY_JSC'] != '1' + pod 'React-jsc', :path => "#{react_native_path}/ReactCommon/jsc" + if fabric_enabled + pod 'React-jsc/Fabric', :path => "#{react_native_path}/ReactCommon/jsc" + end end end @@ -35,7 +37,7 @@ def depend_on_js_engine(s) if ENV["USE_HERMES"] == nil || ENV["USE_HERMES"] == "1" s.dependency 'hermes-engine' s.dependency 'React-hermes' - else + elsif ENV['USE_THIRD_PARTY_JSC'] != '1' s.dependency 'React-jsc' end end diff --git a/packages/react-native/scripts/cocoapods/utils.rb b/packages/react-native/scripts/cocoapods/utils.rb index 4a3dc7d3da68..74386dbc9614 100644 --- a/packages/react-native/scripts/cocoapods/utils.rb +++ b/packages/react-native/scripts/cocoapods/utils.rb @@ -600,7 +600,7 @@ def self.set_imagemanager_search_path(target_installation_result) end def self.react_native_pods - return [ + pods = [ "DoubleConversion", "FBLazyVector", "RCT-Folly", @@ -629,7 +629,6 @@ def self.react_native_pods "React-callinvoker", "React-cxxreact", "React-graphics", - "React-jsc", "React-jsi", "React-jsiexecutor", "React-jsinspector", @@ -647,6 +646,11 @@ def self.react_native_pods "hermes-engine", "React-hermes", ] + if ENV['USE_THIRD_PARTY_JSC'] != '1' + pods << "React-jsc" + end + + return pods end def self.add_search_path_to_result(result, base_path, additional_paths, include_base_path)