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:
Ramanpreet Nara
2020-11-06 13:28:15 -08:00
committed by Facebook GitHub Bot
parent f1e292b9c1
commit cb7f3f4499
9 changed files with 47 additions and 12 deletions
@@ -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
*/
@@ -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();
@@ -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_);
});
}
@@ -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