mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
introduce logic to invoke sync void method (#39970)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/39970 Changelog: [Internal] in this diff, i add the logic that makes void return values run synchronously Reviewed By: javache Differential Revision: D49613770 fbshipit-source-id: ef840fb3ee130430505d000a7cf74e094f9d1405
This commit is contained in:
committed by
Facebook GitHub Bot
parent
4e92f609af
commit
b41a2f92ae
+4
-2
@@ -196,7 +196,8 @@ TurboModuleManager::createTurboModuleProvider() {
|
||||
.moduleName = name,
|
||||
.instance = moduleInstance,
|
||||
.jsInvoker = jsCallInvoker,
|
||||
.nativeMethodCallInvoker = nativeMethodCallInvoker};
|
||||
.nativeMethodCallInvoker = nativeMethodCallInvoker,
|
||||
.shouldVoidMethodsExecuteSync = false};
|
||||
|
||||
auto turboModule = delegate->cthis()->getTurboModule(name, params);
|
||||
turboModuleCache->insert({name, turboModule});
|
||||
@@ -270,7 +271,8 @@ TurboModuleManager::createLegacyModuleProvider() {
|
||||
.moduleName = name,
|
||||
.instance = moduleInstance,
|
||||
.jsInvoker = jsCallInvoker,
|
||||
.nativeMethodCallInvoker = nativeMethodCallInvoker};
|
||||
.nativeMethodCallInvoker = nativeMethodCallInvoker,
|
||||
.shouldVoidMethodsExecuteSync = false};
|
||||
|
||||
static auto getMethodDescriptorsFromModule =
|
||||
javaPart->getClass()
|
||||
|
||||
+17
-2
@@ -31,7 +31,8 @@ namespace TMPL = TurboModulePerfLogger;
|
||||
JavaTurboModule::JavaTurboModule(const InitParams& params)
|
||||
: TurboModule(params.moduleName, params.jsInvoker),
|
||||
instance_(jni::make_global(params.instance)),
|
||||
nativeMethodCallInvoker_(params.nativeMethodCallInvoker) {}
|
||||
nativeMethodCallInvoker_(params.nativeMethodCallInvoker),
|
||||
shouldVoidMethodsExecuteSync_(params.shouldVoidMethodsExecuteSync) {}
|
||||
|
||||
JavaTurboModule::~JavaTurboModule() {
|
||||
/**
|
||||
@@ -454,7 +455,9 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
|
||||
const char* methodName = methodNameStr.c_str();
|
||||
const char* moduleName = name_.c_str();
|
||||
|
||||
bool isMethodSync = !(valueKind == VoidKind || valueKind == PromiseKind);
|
||||
bool isMethodSync =
|
||||
(valueKind == VoidKind && shouldVoidMethodsExecuteSync_) ||
|
||||
!(valueKind == VoidKind || valueKind == PromiseKind);
|
||||
|
||||
if (isMethodSync) {
|
||||
TMPL::syncMethodCallStart(moduleName, methodName);
|
||||
@@ -733,6 +736,18 @@ jsi::Value JavaTurboModule::invokeJavaMethod(
|
||||
return returnValue;
|
||||
}
|
||||
case VoidKind: {
|
||||
if (shouldVoidMethodsExecuteSync_) {
|
||||
env->CallVoidMethodA(instance, methodID, jargs.data());
|
||||
TMPL::syncMethodCallExecutionEnd(moduleName, methodName);
|
||||
TMPL::syncMethodCallEnd(moduleName, methodName);
|
||||
try {
|
||||
FACEBOOK_JNI_THROW_PENDING_EXCEPTION();
|
||||
} catch (...) {
|
||||
throw;
|
||||
}
|
||||
return jsi::Value::undefined();
|
||||
}
|
||||
|
||||
TMPL::asyncMethodCallArgConversionEnd(moduleName, methodName);
|
||||
TMPL::asyncMethodCallDispatch(moduleName, methodName);
|
||||
|
||||
|
||||
+2
@@ -32,6 +32,7 @@ class JSI_EXPORT JavaTurboModule : public TurboModule {
|
||||
jni::alias_ref<jobject> instance;
|
||||
std::shared_ptr<CallInvoker> jsInvoker;
|
||||
std::shared_ptr<NativeMethodCallInvoker> nativeMethodCallInvoker;
|
||||
bool shouldVoidMethodsExecuteSync;
|
||||
};
|
||||
|
||||
JavaTurboModule(const InitParams& params);
|
||||
@@ -50,6 +51,7 @@ class JSI_EXPORT JavaTurboModule : public TurboModule {
|
||||
// instance_ can be of type JTurboModule, or JNativeModule
|
||||
jni::global_ref<jobject> instance_;
|
||||
std::shared_ptr<NativeMethodCallInvoker> nativeMethodCallInvoker_;
|
||||
bool shouldVoidMethodsExecuteSync_;
|
||||
};
|
||||
|
||||
} // namespace facebook::react
|
||||
|
||||
Reference in New Issue
Block a user