mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Setup TurboModule JS Codegen experiment
Summary:
## Android API
```
// Before we initialize TurboModuleManager
ReactFeatureFlags.useTurboModuleJSCodegen = true
```
## iOS API
```
// Before we initialize RCTBridge
RCTEnableTurboModuleJSCodegen(true);
```
## How is the JS Codegen actually enabled?
The above native flags are translated to the following global variable in JavaScript:
```
global.RN$JSTurboModuleCodegenEnabled = true;
```
Then, all our NativeModule specs are transpiled to contain this logic:
```
interface Foo extends TurboModule {
// ...
}
function __getModuleSchema() {
if (!global.RN$JSTurboModuleCodegenEnabled) {
return undefined;
}
// Return the schema of this spec.
return {...};
}
export default TurboModuleRegistry.get<Foo>('foo', __getModuleSchema());
```
Then, in our C++ JavaTurboModule, and ObjCTurboModule classes, we use the TurboModule JS codegen when the jsi::Object schema is provided from JavaScript in the TurboModuleRegistry.get call.
Changelog: [Internal]
Reviewed By: PeteTheHeat
Differential Revision: D24636307
fbshipit-source-id: 80dcd604cc1121b8a69df875bbfc87e9bb8e4814
This commit is contained in:
committed by
Facebook GitHub Bot
parent
f1e292b9c1
commit
cb7f3f4499
@@ -26,6 +26,9 @@ public class ReactFeatureFlags {
|
||||
/** Should we dispatch TurboModule methods with promise returns to the NativeModules thread? */
|
||||
public static volatile boolean enableTurboModulePromiseAsyncDispatch = false;
|
||||
|
||||
/** Enable TurboModule JS Codegen. */
|
||||
public static volatile boolean useTurboModuleJSCodegen = false;
|
||||
|
||||
/*
|
||||
* This feature flag enables logs for Fabric
|
||||
*/
|
||||
|
||||
+4
-2
@@ -61,7 +61,8 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
|
||||
(CallInvokerHolderImpl) jsCallInvokerHolder,
|
||||
(CallInvokerHolderImpl) nativeCallInvokerHolder,
|
||||
delegate,
|
||||
ReactFeatureFlags.enableTurboModulePromiseAsyncDispatch);
|
||||
ReactFeatureFlags.enableTurboModulePromiseAsyncDispatch,
|
||||
ReactFeatureFlags.useTurboModuleJSCodegen);
|
||||
installJSIBindings();
|
||||
|
||||
mEagerInitModuleNames =
|
||||
@@ -294,7 +295,8 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
|
||||
CallInvokerHolderImpl jsCallInvokerHolder,
|
||||
CallInvokerHolderImpl nativeCallInvokerHolder,
|
||||
TurboModuleManagerDelegate tmmDelegate,
|
||||
boolean enablePromiseAsyncDispatch);
|
||||
boolean enablePromiseAsyncDispatch,
|
||||
boolean enableTurboModuleJSCodegen);
|
||||
|
||||
private native void installJSIBindings();
|
||||
|
||||
|
||||
+10
-5
@@ -26,13 +26,15 @@ TurboModuleManager::TurboModuleManager(
|
||||
jsi::Runtime *rt,
|
||||
std::shared_ptr<CallInvoker> jsCallInvoker,
|
||||
std::shared_ptr<CallInvoker> nativeCallInvoker,
|
||||
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate)
|
||||
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
|
||||
bool enableJSCodegen)
|
||||
: javaPart_(jni::make_global(jThis)),
|
||||
runtime_(rt),
|
||||
jsCallInvoker_(jsCallInvoker),
|
||||
nativeCallInvoker_(nativeCallInvoker),
|
||||
delegate_(jni::make_global(delegate)),
|
||||
turboModuleCache_(std::make_shared<TurboModuleCache>()) {}
|
||||
turboModuleCache_(std::make_shared<TurboModuleCache>()),
|
||||
enableJSCodegen_(enableJSCodegen) {}
|
||||
|
||||
jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
|
||||
jni::alias_ref<jhybridobject> jThis,
|
||||
@@ -40,7 +42,8 @@ jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
|
||||
jni::alias_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder,
|
||||
jni::alias_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder,
|
||||
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
|
||||
bool enablePromiseAsyncDispatch) {
|
||||
bool enablePromiseAsyncDispatch,
|
||||
bool enableJSCodegen) {
|
||||
auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();
|
||||
auto nativeCallInvoker = nativeCallInvokerHolder->cthis()->getCallInvoker();
|
||||
|
||||
@@ -51,7 +54,8 @@ jni::local_ref<TurboModuleManager::jhybriddata> TurboModuleManager::initHybrid(
|
||||
(jsi::Runtime *)jsContext,
|
||||
jsCallInvoker,
|
||||
nativeCallInvoker,
|
||||
delegate);
|
||||
delegate,
|
||||
enableJSCodegen);
|
||||
}
|
||||
|
||||
void TurboModuleManager::registerNatives() {
|
||||
@@ -146,7 +150,8 @@ void TurboModuleManager::installJSIBindings() {
|
||||
|
||||
jsCallInvoker_->invokeAsync(
|
||||
[this, turboModuleProvider = std::move(turboModuleProvider)]() -> void {
|
||||
TurboModuleBinding::install(*runtime_, std::move(turboModuleProvider));
|
||||
TurboModuleBinding::install(
|
||||
*runtime_, std::move(turboModuleProvider), enableJSCodegen_);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+5
-2
@@ -31,7 +31,8 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
|
||||
jni::alias_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder,
|
||||
jni::alias_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder,
|
||||
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
|
||||
bool enablePromiseAsyncDispatch);
|
||||
bool enablePromiseAsyncDispatch,
|
||||
bool enableJSCodegen);
|
||||
static void registerNatives();
|
||||
|
||||
private:
|
||||
@@ -52,6 +53,7 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
|
||||
* they want to be long-lived or short-lived.
|
||||
*/
|
||||
std::shared_ptr<TurboModuleCache> turboModuleCache_;
|
||||
bool enableJSCodegen_;
|
||||
|
||||
void installJSIBindings();
|
||||
explicit TurboModuleManager(
|
||||
@@ -59,7 +61,8 @@ class TurboModuleManager : public jni::HybridClass<TurboModuleManager> {
|
||||
jsi::Runtime *rt,
|
||||
std::shared_ptr<CallInvoker> jsCallInvoker,
|
||||
std::shared_ptr<CallInvoker> nativeCallInvoker,
|
||||
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate);
|
||||
jni::alias_ref<TurboModuleManagerDelegate::javaobject> delegate,
|
||||
bool enableJSCodegen);
|
||||
};
|
||||
|
||||
} // namespace react
|
||||
|
||||
Reference in New Issue
Block a user