Skip to content

Commit d73b61c

Browse files
lunaleapsjavache
andauthored
Do not create RuntimeExecutor on non-JSI executors (#38125) (#38142)
Co-authored-by: Pieter De Baets <pieterdb@meta.com> resolved: #38125
1 parent e22bd7f commit d73b61c

File tree

4 files changed

+44
-32
lines changed

4 files changed

+44
-32
lines changed

packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -418,8 +418,11 @@ CatalystInstanceImpl::getNativeCallInvokerHolder() {
418418
jni::alias_ref<JRuntimeExecutor::javaobject>
419419
CatalystInstanceImpl::getRuntimeExecutor() {
420420
if (!runtimeExecutor_) {
421-
runtimeExecutor_ = jni::make_global(
422-
JRuntimeExecutor::newObjectCxxArgs(instance_->getRuntimeExecutor()));
421+
auto executor = instance_->getRuntimeExecutor();
422+
if (executor) {
423+
runtimeExecutor_ =
424+
jni::make_global(JRuntimeExecutor::newObjectCxxArgs(executor));
425+
}
423426
}
424427
return runtimeExecutor_;
425428
}
@@ -428,15 +431,16 @@ jni::alias_ref<JRuntimeScheduler::javaobject>
428431
CatalystInstanceImpl::getRuntimeScheduler() {
429432
if (!runtimeScheduler_) {
430433
auto runtimeExecutor = instance_->getRuntimeExecutor();
431-
auto runtimeScheduler = std::make_shared<RuntimeScheduler>(runtimeExecutor);
432-
433-
runtimeScheduler_ =
434-
jni::make_global(JRuntimeScheduler::newObjectCxxArgs(runtimeScheduler));
435-
436-
runtimeExecutor([runtimeScheduler](jsi::Runtime &runtime) {
437-
RuntimeSchedulerBinding::createAndInstallIfNeeded(
438-
runtime, runtimeScheduler);
439-
});
434+
if (runtimeExecutor) {
435+
auto runtimeScheduler =
436+
std::make_shared<RuntimeScheduler>(runtimeExecutor);
437+
runtimeScheduler_ = jni::make_global(
438+
JRuntimeScheduler::newObjectCxxArgs(runtimeScheduler));
439+
runtimeExecutor([scheduler =
440+
std::move(runtimeScheduler)](jsi::Runtime &runtime) {
441+
RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, scheduler);
442+
});
443+
}
440444
}
441445

442446
return runtimeScheduler_;

packages/react-native/ReactCommon/cxxreact/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ target_link_libraries(reactnative
2727
jsinspector
2828
logger
2929
reactperflogger
30-
runtimeexecutor)
30+
runtimeexecutor
31+
react_debug)

packages/react-native/ReactCommon/cxxreact/Instance.cpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <cxxreact/JSIndexedRAMBundle.h>
2222
#include <folly/MoveWrapper.h>
2323
#include <folly/json.h>
24+
#include <react/debug/react_native_assert.h>
2425

2526
#include <glog/logging.h>
2627

@@ -212,26 +213,31 @@ std::shared_ptr<CallInvoker> Instance::getJSCallInvoker() {
212213
}
213214

214215
RuntimeExecutor Instance::getRuntimeExecutor() {
215-
std::weak_ptr<NativeToJsBridge> weakNativeToJsBridge = nativeToJsBridge_;
216+
// HACK: RuntimeExecutor is not compatible with non-JSIExecutor, we return
217+
// a null callback, which the caller should handle.
218+
if (!getJavaScriptContext()) {
219+
return nullptr;
220+
}
216221

217-
auto runtimeExecutor =
218-
[weakNativeToJsBridge](
219-
std::function<void(jsi::Runtime & runtime)> &&callback) {
220-
if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) {
221-
strongNativeToJsBridge->runOnExecutorQueue(
222-
[callback = std::move(callback)](JSExecutor *executor) {
223-
jsi::Runtime *runtime =
224-
(jsi::Runtime *)executor->getJavaScriptContext();
225-
try {
226-
callback(*runtime);
227-
executor->flush();
228-
} catch (jsi::JSError &originalError) {
229-
handleJSError(*runtime, originalError, true);
230-
}
231-
});
232-
}
233-
};
234-
return runtimeExecutor;
222+
std::weak_ptr<NativeToJsBridge> weakNativeToJsBridge = nativeToJsBridge_;
223+
return [weakNativeToJsBridge](
224+
std::function<void(jsi::Runtime & runtime)> &&callback) {
225+
if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) {
226+
strongNativeToJsBridge->runOnExecutorQueue(
227+
[callback = std::move(callback)](JSExecutor *executor) {
228+
// Assumes the underlying executor is a JSIExecutor
229+
jsi::Runtime *runtime =
230+
(jsi::Runtime *)executor->getJavaScriptContext();
231+
try {
232+
react_native_assert(runtime != nullptr);
233+
callback(*runtime);
234+
executor->flush();
235+
} catch (jsi::JSError &originalError) {
236+
handleJSError(*runtime, originalError, true);
237+
}
238+
});
239+
}
240+
};
235241
}
236242

237243
std::shared_ptr<CallInvoker> Instance::getDecoratedNativeCallInvoker(

packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Pod::Spec.new do |s|
3333
s.source_files = "*.{cpp,h}"
3434
s.exclude_files = "SampleCxxModule.*"
3535
s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
36-
s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers\"",
36+
s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"",
3737
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17" }
3838
s.header_dir = "cxxreact"
3939

@@ -47,6 +47,7 @@ Pod::Spec.new do |s|
4747
s.dependency "React-perflogger", version
4848
s.dependency "React-jsi", version
4949
s.dependency "React-logger", version
50+
s.dependency "React-debug", version
5051

5152
if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1"
5253
s.dependency 'hermes-engine'

0 commit comments

Comments
 (0)