refactor JSI module initialization

Reviewed By: fkgozali

Differential Revision: D8111636

fbshipit-source-id: 6e32703b077144962519485002adff8c9f6084ad
This commit is contained in:
David Vacca
2018-06-01 17:47:34 -07:00
committed by Facebook Github Bot
parent e0db8ee645
commit 6c989fe7c6
12 changed files with 108 additions and 81 deletions

View File

@@ -47,7 +47,7 @@ import com.facebook.infer.annotation.ThreadSafe;
import com.facebook.react.bridge.CatalystInstance;
import com.facebook.react.bridge.CatalystInstanceImpl;
import com.facebook.react.bridge.JSBundleLoader;
import com.facebook.react.bridge.JSIModulesProvider;
import com.facebook.react.bridge.JSIModulePackage;
import com.facebook.react.bridge.JavaJSExecutor;
import com.facebook.react.bridge.JavaScriptExecutor;
import com.facebook.react.bridge.JavaScriptExecutorFactory;
@@ -159,7 +159,7 @@ public class ReactInstanceManager {
private final MemoryPressureRouter mMemoryPressureRouter;
private final @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler;
private final boolean mLazyNativeModulesEnabled;
private final @Nullable JSIModulesProvider mJSIModulesProvider;
private final @Nullable JSIModulePackage mJSIModulePackage;
private List<ViewManager> mViewManagers;
private class ReactContextInitParams {
@@ -208,7 +208,7 @@ public class ReactInstanceManager {
@Nullable DevBundleDownloadListener devBundleDownloadListener,
int minNumShakes,
int minTimeLeftInFrameForNonBatchedOperationMs,
@Nullable JSIModulesProvider jsiModulesProvider) {
@Nullable JSIModulePackage jsiModulePackage) {
Log.d(ReactConstants.TAG, "ReactInstanceManager.ctor()");
initializeSoLoaderIfNecessary(applicationContext);
@@ -256,7 +256,7 @@ public class ReactInstanceManager {
}
mPackages.addAll(packages);
}
mJSIModulesProvider = jsiModulesProvider;
mJSIModulePackage = jsiModulePackage;
// Instantiate ReactChoreographer in UI thread.
ReactChoreographer.initialize();
@@ -1102,8 +1102,8 @@ public class ReactInstanceManager {
Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE);
ReactMarker.logMarker(CREATE_CATALYST_INSTANCE_END);
}
if (mJSIModulesProvider != null) {
catalystInstance.addJSIModules(mJSIModulesProvider
if (mJSIModulePackage != null) {
catalystInstance.addJSIModules(mJSIModulePackage
.getJSIModules(reactContext, catalystInstance.getJavaScriptContextHolder()));
}

View File

@@ -10,7 +10,7 @@ import static com.facebook.react.modules.systeminfo.AndroidInfoHelpers.getFriend
import android.app.Activity;
import android.app.Application;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.JSIModulesProvider;
import com.facebook.react.bridge.JSIModulePackage;
import com.facebook.react.bridge.JSBundleLoader;
import com.facebook.react.bridge.JSCJavaScriptExecutorFactory;
import com.facebook.react.bridge.JavaScriptExecutorFactory;
@@ -51,7 +51,7 @@ public class ReactInstanceManagerBuilder {
private @Nullable JavaScriptExecutorFactory mJavaScriptExecutorFactory;
private int mMinNumShakes = 1;
private int mMinTimeLeftInFrameForNonBatchedOperationMs = -1;
private @Nullable JSIModulesProvider mJSIModulesProvider;
private @Nullable JSIModulePackage mJSIModulesPackage;
/* package protected */ ReactInstanceManagerBuilder() {
}
@@ -66,9 +66,9 @@ public class ReactInstanceManagerBuilder {
return this;
}
public ReactInstanceManagerBuilder setJSIModulesProvider(
@Nullable JSIModulesProvider jsiModulesProvider) {
mJSIModulesProvider = jsiModulesProvider;
public ReactInstanceManagerBuilder setJSIModulesPackage(
@Nullable JSIModulePackage jsiModulePackage) {
mJSIModulesPackage = jsiModulePackage;
return this;
}
@@ -284,6 +284,6 @@ public class ReactInstanceManagerBuilder {
mDevBundleDownloadListener,
mMinNumShakes,
mMinTimeLeftInFrameForNonBatchedOperationMs,
mJSIModulesProvider);
mJSIModulesPackage);
}
}

View File

@@ -7,7 +7,7 @@
package com.facebook.react;
import com.facebook.react.bridge.JSIModulesProvider;
import com.facebook.react.bridge.JSIModulePackage;
import javax.annotation.Nullable;
import java.util.List;
@@ -15,7 +15,6 @@ import java.util.List;
import android.app.Application;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.JSIModulesProvider;
import com.facebook.react.bridge.JavaScriptExecutorFactory;
import com.facebook.react.bridge.ReactMarker;
import com.facebook.react.bridge.ReactMarkerConstants;
@@ -76,7 +75,7 @@ public abstract class ReactNativeHost {
.setRedBoxHandler(getRedBoxHandler())
.setJavaScriptExecutorFactory(getJavaScriptExecutorFactory())
.setUIImplementationProvider(getUIImplementationProvider())
.setJSIModulesProvider(getJSIModulesProvider())
.setJSIModulesPackage(getJSIModulePackage())
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE);
for (ReactPackage reactPackage : getPackages()) {
@@ -124,7 +123,7 @@ public abstract class ReactNativeHost {
}
protected @Nullable
JSIModulesProvider getJSIModulesProvider() {
JSIModulePackage getJSIModulePackage() {
return null;
}

View File

@@ -101,5 +101,5 @@ public interface CatalystInstance
*/
JavaScriptContextHolder getJavaScriptContextHolder();
void addJSIModules(List<JSIModuleHolder> jsiModules);
void addJSIModules(List<JSIModuleSpec> jsiModules);
}

View File

@@ -464,7 +464,7 @@ public class CatalystInstanceImpl implements CatalystInstance {
}
@Override
public void addJSIModules(List<JSIModuleHolder> jsiModules) {
public void addJSIModules(List<JSIModuleSpec> jsiModules) {
mJSIModuleRegistry.registerModules(jsiModules);
}

View File

@@ -1,12 +1,23 @@
package com.facebook.react.bridge;
/**
* Holder class used to register {@link JSIModule} into JSI Bridge.
*/
public interface JSIModuleHolder {
public class JSIModuleHolder {
Class<? extends JSIModule> getJSIModuleClass();
private JSIModule mModule;
private final JSIModuleSpec mSpec;
<T extends JSIModule> T getJSIModule();
public JSIModuleHolder(JSIModuleSpec spec) {
mSpec = spec;
}
public JSIModule getJSIModule() {
if (mModule == null) {
synchronized (this) {
if (mModule != null) {
return mModule;
}
mModule = mSpec.getJSIModuleProvider().get();
}
}
return mModule;
}
}

View File

@@ -0,0 +1,15 @@
package com.facebook.react.bridge;
import java.util.List;
/**
* Interface used to initialize JSI Modules into the JSI Bridge.
*/
public interface JSIModulePackage {
/**
* @return a {@link List< JSIModuleSpec >} that contain the list of JSI Modules.
*/
List<JSIModuleSpec> getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext);
}

View File

@@ -0,0 +1,7 @@
package com.facebook.react.bridge;
public interface JSIModuleProvider<T extends JSIModule> {
T get();
}

View File

@@ -1,37 +1,28 @@
package com.facebook.react.bridge;
import com.facebook.infer.annotation.Assertions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JSIModuleRegistry {
private final List<JSIModuleHolder> mModuleList = new ArrayList<>();
private final Map<Class, JSIModule> mModules = new HashMap<>();
private volatile boolean mIsInitialized = false;
private final Map<Class, JSIModuleHolder> mModules = new HashMap<>();
public JSIModuleRegistry() { }
public <T extends JSIModule> T getModule(Class<T> moduleClass) {
JSIModule jsiModule = mModules.get(moduleClass);
if (jsiModule == null) {
initModules();
JSIModuleHolder jsiModuleHolder = mModules.get(moduleClass);
if (jsiModuleHolder == null) {
throw new IllegalArgumentException("Unable to find JSIModule for class " + moduleClass);
}
return (T) Assertions.assertNotNull(mModules.get(moduleClass));
return (T) Assertions.assertNotNull(jsiModuleHolder.getJSIModule());
}
public void registerModules(List<JSIModuleHolder> jsiModules) {
mModuleList.addAll(jsiModules);
}
public synchronized void initModules() {
if (!mIsInitialized) {
for (JSIModuleHolder holder : mModuleList) {
mModules.put(holder.getJSIModuleClass(), holder.getJSIModule());
}
mIsInitialized = true;
public void registerModules(List<JSIModuleSpec> jsiModules) {
for (JSIModuleSpec spec : jsiModules) {
mModules.put(spec.getJSIModuleClass(), new JSIModuleHolder(spec));
}
}
}

View File

@@ -0,0 +1,12 @@
package com.facebook.react.bridge;
/**
* Holder class used to register {@link JSIModule} into JSI Bridge.
*/
public interface JSIModuleSpec<T extends JSIModule> {
Class<? extends JSIModule> getJSIModuleClass();
JSIModuleProvider<T> getJSIModuleProvider();
}

View File

@@ -1,15 +0,0 @@
package com.facebook.react.bridge;
import java.util.List;
/**
* Interface used to initialize JSI Modules into the JSI Bridge.
*/
public interface JSIModulesProvider {
/**
* @return a {@link List<JSIModuleHolder>} that contain the list of JSI Modules.
*/
List<JSIModuleHolder> getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext);
}