From 767d217818d045289a5dd0c3b85fb1dc2d9284b2 Mon Sep 17 00:00:00 2001 From: maciej simka Date: Wed, 22 Jan 2020 14:39:35 +0100 Subject: [PATCH 1/3] feat: split loadApplicationScript into initializeRuntime and loadBundle --- React/CxxBridge/RCTCxxBridge.mm | 2 +- React/CxxBridge/RCTObjcExecutor.mm | 6 ++++- .../facebook/react/bridge/JavaJSExecutor.java | 2 +- .../react/bridge/ReactMarkerConstants.java | 4 +-- .../devsupport/JSDebuggerWebSocketClient.java | 2 +- .../WebsocketJavaScriptExecutor.java | 6 ++--- .../src/main/jni/react/jni/JReactMarker.cpp | 4 +-- .../src/main/jni/react/jni/ProxyExecutor.cpp | 15 ++++++----- .../src/main/jni/react/jni/ProxyExecutor.h | 3 ++- .../JSDebuggerWebSocketClientTest.java | 4 +-- ReactCommon/cxxreact/Instance.cpp | 25 ++++++++++--------- ReactCommon/cxxreact/Instance.h | 6 +++-- ReactCommon/cxxreact/JSExecutor.h | 6 ++++- ReactCommon/cxxreact/NativeToJsBridge.cpp | 15 ++++++++--- ReactCommon/cxxreact/NativeToJsBridge.h | 11 +++++--- .../jsiexecutor/jsireact/JSIExecutor.cpp | 22 ++++++++++------ .../jsiexecutor/jsireact/JSIExecutor.h | 3 ++- 17 files changed, 85 insertions(+), 51 deletions(-) diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index 29d86e144d0edf..69f9d248dd6fc8 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -1336,7 +1336,7 @@ - (void)executeApplicationScript:(NSData *)script self->_reactInstance->loadScriptFromString(std::make_unique(script), sourceUrlStr.UTF8String, !async); } else { - std::string methodName = async ? "loadApplicationScript" : "loadApplicationScriptSync"; + std::string methodName = async ? "loadBundle" : "loadBundleSync"; throw std::logic_error("Attempt to call " + methodName + ": on uninitialized bridge"); } }]; diff --git a/React/CxxBridge/RCTObjcExecutor.mm b/React/CxxBridge/RCTObjcExecutor.mm index ead98eb7fd0402..7c4da26bf71d46 100644 --- a/React/CxxBridge/RCTObjcExecutor.mm +++ b/React/CxxBridge/RCTObjcExecutor.mm @@ -74,7 +74,11 @@ std::make_unique(folly::toJson(config))); } - void loadApplicationScript( + void initializeRuntime() { + // We do nothing here since initialization is done in the constructor + } + + void loadBundle( std::unique_ptr script, std::string sourceURL) override { RCTProfileBeginFlowEvent(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaJSExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaJSExecutor.java index b9572f64ce3eb1..db9f29b130e7fa 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaJSExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaJSExecutor.java @@ -38,7 +38,7 @@ public ProxyExecutorException(Throwable cause) { * @param sourceURL url or file location from which script content was loaded */ @DoNotStrip - void loadApplicationScript(String sourceURL) throws ProxyExecutorException; + void loadBundle(String sourceURL) throws ProxyExecutorException; /** * Execute javascript method within js context diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java index dd08b9a8eea480..5eecfd55af2fd5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java @@ -59,8 +59,8 @@ public enum ReactMarkerConstants { UNPACKING_JS_BUNDLE_LOADER_CHECK_END, UNPACKING_JS_BUNDLE_LOADER_EXTRACTED, UNPACKING_JS_BUNDLE_LOADER_BLOCKED, - loadApplicationScript_startStringConvert, - loadApplicationScript_endStringConvert, + loadBundle_startStringConvert, + loadBundle_endStringConvert, PRE_SETUP_REACT_CONTEXT_START, PRE_SETUP_REACT_CONTEXT_END, PRE_RUN_JS_BUNDLE_START, diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDebuggerWebSocketClient.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDebuggerWebSocketClient.java index 22729b34d78777..66ad0e9acfe55e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDebuggerWebSocketClient.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDebuggerWebSocketClient.java @@ -81,7 +81,7 @@ public void prepareJSRuntime(JSDebuggerCallback callback) { } } - public void loadApplicationScript( + public void loadBundle( String sourceURL, HashMap injectedObjects, JSDebuggerCallback callback) { int requestID = mRequestID.getAndIncrement(); mCallbacks.put(requestID, callback); diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/WebsocketJavaScriptExecutor.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/WebsocketJavaScriptExecutor.java index b045cf69f48b04..4102841065c646 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/WebsocketJavaScriptExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/WebsocketJavaScriptExecutor.java @@ -153,10 +153,10 @@ public void close() { } @Override - public void loadApplicationScript(String sourceURL) throws JavaJSExecutor.ProxyExecutorException { + public void loadBundle(String sourceURL) throws JavaJSExecutor.ProxyExecutorException { JSExecutorCallbackFuture callback = new JSExecutorCallbackFuture(); Assertions.assertNotNull(mWebSocketClient) - .loadApplicationScript(sourceURL, mInjectedObjects, callback); + .loadBundle(sourceURL, mInjectedObjects, callback); try { callback.get(); } catch (Throwable cause) { @@ -178,7 +178,7 @@ public void loadApplicationScript(String sourceURL) throws JavaJSExecutor.ProxyE @Override public void setGlobalVariable(String propertyName, String jsonEncodedValue) { - // Store and use in the next loadApplicationScript() call. + // Store and use in the next loadBundle() call. mInjectedObjects.put(propertyName, jsonEncodedValue); } } diff --git a/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp b/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp index 7409681e1a4295..a67463c44da079 100644 --- a/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp +++ b/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp @@ -49,10 +49,10 @@ void JReactMarker::logPerfMarker( JReactMarker::logMarker("CREATE_REACT_CONTEXT_END"); break; case ReactMarker::JS_BUNDLE_STRING_CONVERT_START: - JReactMarker::logMarker("loadApplicationScript_startStringConvert"); + JReactMarker::logMarker("loadBundle_startStringConvert"); break; case ReactMarker::JS_BUNDLE_STRING_CONVERT_STOP: - JReactMarker::logMarker("loadApplicationScript_endStringConvert"); + JReactMarker::logMarker("loadBundle_endStringConvert"); break; case ReactMarker::NATIVE_MODULE_SETUP_START: JReactMarker::logMarker("NATIVE_MODULE_SETUP_START", tag); diff --git a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp index 43914cadd2f48c..37179ba5372fdf 100644 --- a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp +++ b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp @@ -53,9 +53,7 @@ ProxyExecutor::~ProxyExecutor() { m_executor.reset(); } -void ProxyExecutor::loadApplicationScript( - std::unique_ptr, - std::string sourceURL) { +void ProxyExecutor::initializeRuntime() { folly::dynamic nativeModuleConfig = folly::dynamic::array; { @@ -76,14 +74,19 @@ void ProxyExecutor::loadApplicationScript( "__fbBatchedBridgeConfig", std::make_unique(folly::toJson(config))); } +} + +void ProxyExecutor::loadBundle( + std::unique_ptr, + std::string sourceURL) { - static auto loadApplicationScript = + static auto loadBundle = jni::findClassStatic(EXECUTOR_BASECLASS) - ->getMethod("loadApplicationScript"); + ->getMethod("loadBundle"); // The proxy ignores the script data passed in. - loadApplicationScript(m_executor.get(), jni::make_jstring(sourceURL).get()); + loadBundle(m_executor.get(), jni::make_jstring(sourceURL).get()); // We can get pending calls here to native but the queue will be drained when // we launch the application. } diff --git a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h index fa1c12634fcfbd..c9eab4170d41f4 100644 --- a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h +++ b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h @@ -37,7 +37,8 @@ class ProxyExecutor : public JSExecutor { jni::global_ref &&executorInstance, std::shared_ptr delegate); virtual ~ProxyExecutor() override; - virtual void loadApplicationScript( + virtual void initializeRuntime() override; + virtual void loadBundle( std::unique_ptr script, std::string sourceURL) override; virtual void setBundleRegistry( diff --git a/ReactAndroid/src/test/java/com/facebook/react/devsupport/JSDebuggerWebSocketClientTest.java b/ReactAndroid/src/test/java/com/facebook/react/devsupport/JSDebuggerWebSocketClientTest.java index 3a341c7136880e..0c6bbde0e8bdd0 100644 --- a/ReactAndroid/src/test/java/com/facebook/react/devsupport/JSDebuggerWebSocketClientTest.java +++ b/ReactAndroid/src/test/java/com/facebook/react/devsupport/JSDebuggerWebSocketClientTest.java @@ -40,7 +40,7 @@ public void test_prepareJSRuntime_ShouldSendCorrectMessage() throws Exception { } @Test - public void test_loadApplicationScript_ShouldSendCorrectMessage() throws Exception { + public void test_loadBundle_ShouldSendCorrectMessage() throws Exception { final JSDebuggerWebSocketClient.JSDebuggerCallback cb = PowerMockito.mock(JSDebuggerWebSocketClient.JSDebuggerCallback.class); @@ -49,7 +49,7 @@ public void test_loadApplicationScript_ShouldSendCorrectMessage() throws Excepti injectedObjects.put("key1", "value1"); injectedObjects.put("key2", "value2"); - client.loadApplicationScript("http://localhost:8080/index.js", injectedObjects, cb); + client.loadBundle("http://localhost:8080/index.js", injectedObjects, cb); PowerMockito.verifyPrivate(client) .invoke( "sendMessage", diff --git a/ReactCommon/cxxreact/Instance.cpp b/ReactCommon/cxxreact/Instance.cpp index 65f1ce171d5925..556208b0f0dba0 100644 --- a/ReactCommon/cxxreact/Instance.cpp +++ b/ReactCommon/cxxreact/Instance.cpp @@ -48,7 +48,8 @@ void Instance::initializeBridge( jsQueue->runOnQueueSync([this, &jsef, jsQueue]() mutable { nativeToJsBridge_ = std::make_unique( jsef.get(), moduleRegistry_, jsQueue, callback_); - + // TODO investigate why it has to be async + nativeToJsBridge_->initializeRuntime(); std::lock_guard lock(m_syncMutex); m_syncReady = true; m_syncCV.notify_all(); @@ -57,25 +58,25 @@ void Instance::initializeBridge( CHECK(nativeToJsBridge_); } -void Instance::loadApplication( +void Instance::loadBundle( std::unique_ptr bundleRegistry, std::unique_ptr string, std::string sourceURL) { callback_->incrementPendingJSCalls(); - SystraceSection s("Instance::loadApplication", "sourceURL", sourceURL); - nativeToJsBridge_->loadApplication( + SystraceSection s("Instance::loadBundle", "sourceURL", sourceURL); + nativeToJsBridge_->loadBundle( std::move(bundleRegistry), std::move(string), std::move(sourceURL)); } -void Instance::loadApplicationSync( +void Instance::loadBundleSync( std::unique_ptr bundleRegistry, std::unique_ptr string, std::string sourceURL) { std::unique_lock lock(m_syncMutex); m_syncCV.wait(lock, [this] { return m_syncReady; }); - SystraceSection s("Instance::loadApplicationSync", "sourceURL", sourceURL); - nativeToJsBridge_->loadApplicationSync( + SystraceSection s("Instance::loadBundleSync", "sourceURL", sourceURL); + nativeToJsBridge_->loadBundleSync( std::move(bundleRegistry), std::move(string), std::move(sourceURL)); } @@ -83,7 +84,7 @@ void Instance::setSourceURL(std::string sourceURL) { callback_->incrementPendingJSCalls(); SystraceSection s("Instance::setSourceURL", "sourceURL", sourceURL); - nativeToJsBridge_->loadApplication(nullptr, nullptr, std::move(sourceURL)); + nativeToJsBridge_->loadBundle(nullptr, nullptr, std::move(sourceURL)); } void Instance::loadScriptFromString( @@ -92,9 +93,9 @@ void Instance::loadScriptFromString( bool loadSynchronously) { SystraceSection s("Instance::loadScriptFromString", "sourceURL", sourceURL); if (loadSynchronously) { - loadApplicationSync(nullptr, std::move(string), std::move(sourceURL)); + loadBundleSync(nullptr, std::move(string), std::move(sourceURL)); } else { - loadApplication(nullptr, std::move(string), std::move(sourceURL)); + loadBundle(nullptr, std::move(string), std::move(sourceURL)); } } @@ -150,12 +151,12 @@ void Instance::loadRAMBundle( std::string startupScriptSourceURL, bool loadSynchronously) { if (loadSynchronously) { - loadApplicationSync( + loadBundleSync( std::move(bundleRegistry), std::move(startupScript), std::move(startupScriptSourceURL)); } else { - loadApplication( + loadBundle( std::move(bundleRegistry), std::move(startupScript), std::move(startupScriptSourceURL)); diff --git a/ReactCommon/cxxreact/Instance.h b/ReactCommon/cxxreact/Instance.h index f7b9a7f19697c6..4dc0b6737af23b 100644 --- a/ReactCommon/cxxreact/Instance.h +++ b/ReactCommon/cxxreact/Instance.h @@ -44,6 +44,8 @@ class RN_EXPORT Instance { std::shared_ptr jsQueue, std::shared_ptr moduleRegistry); + void initializeRuntime(); + void setSourceURL(std::string sourceURL); void loadScriptFromString(std::unique_ptr string, @@ -79,10 +81,10 @@ class RN_EXPORT Instance { private: void callNativeModules(folly::dynamic &&calls, bool isEndOfBatch); - void loadApplication(std::unique_ptr bundleRegistry, + void loadBundle(std::unique_ptr bundleRegistry, std::unique_ptr startupScript, std::string startupScriptSourceURL); - void loadApplicationSync(std::unique_ptr bundleRegistry, + void loadBundleSync(std::unique_ptr bundleRegistry, std::unique_ptr startupScript, std::string startupScriptSourceURL); diff --git a/ReactCommon/cxxreact/JSExecutor.h b/ReactCommon/cxxreact/JSExecutor.h index fe1dc1b1175625..a70bd9e2eb0944 100644 --- a/ReactCommon/cxxreact/JSExecutor.h +++ b/ReactCommon/cxxreact/JSExecutor.h @@ -53,10 +53,14 @@ class JSExecutorFactory { class RN_EXPORT JSExecutor { public: + /** + * Sets all globals in the JS context. + */ + virtual void initializeRuntime() = 0; /** * Execute an application script bundle in the JS context. */ - virtual void loadApplicationScript(std::unique_ptr script, + virtual void loadBundle(std::unique_ptr script, std::string sourceURL) = 0; /** diff --git a/ReactCommon/cxxreact/NativeToJsBridge.cpp b/ReactCommon/cxxreact/NativeToJsBridge.cpp index 0e34f942a858c6..2a9dce0d2e0f0a 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.cpp +++ b/ReactCommon/cxxreact/NativeToJsBridge.cpp @@ -108,7 +108,14 @@ NativeToJsBridge::~NativeToJsBridge() { << "NativeToJsBridge::destroy() must be called before deallocating the NativeToJsBridge!"; } -void NativeToJsBridge::loadApplication( +void NativeToJsBridge::initializeRuntime() { + runOnExecutorQueue([] + (JSExecutor* executor) mutable { + executor->initializeRuntime(); + }); +} + +void NativeToJsBridge::loadBundle( std::unique_ptr bundleRegistry, std::unique_ptr startupScript, std::string startupScriptSourceURL) { @@ -123,7 +130,7 @@ void NativeToJsBridge::loadApplication( executor->setBundleRegistry(std::move(bundleRegistry)); } try { - executor->loadApplicationScript( + executor->loadBundle( std::move(*startupScript), std::move(startupScriptSourceURL)); } catch (...) { m_applicationScriptHasFailure = true; @@ -132,7 +139,7 @@ void NativeToJsBridge::loadApplication( }); } -void NativeToJsBridge::loadApplicationSync( +void NativeToJsBridge::loadBundleSync( std::unique_ptr bundleRegistry, std::unique_ptr startupScript, std::string startupScriptSourceURL) { @@ -140,7 +147,7 @@ void NativeToJsBridge::loadApplicationSync( m_executor->setBundleRegistry(std::move(bundleRegistry)); } try { - m_executor->loadApplicationScript( + m_executor->loadBundle( std::move(startupScript), std::move(startupScriptSourceURL)); } catch (...) { m_applicationScriptHasFailure = true; diff --git a/ReactCommon/cxxreact/NativeToJsBridge.h b/ReactCommon/cxxreact/NativeToJsBridge.h index aa0c569b214f90..46837f38bdd88a 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.h +++ b/ReactCommon/cxxreact/NativeToJsBridge.h @@ -31,7 +31,7 @@ class RAMBundleRegistry; // executors and their threads. All functions here can be called from // any thread. // -// Except for loadApplicationScriptSync(), all void methods will queue +// Except for loadBundleSync(), all void methods will queue // work to run on the jsQueue passed to the ctor, and return // immediately. class NativeToJsBridge { @@ -59,16 +59,21 @@ class NativeToJsBridge { */ void invokeCallback(double callbackId, folly::dynamic&& args); + /** + * Sets global variables in the JS Context. + */ + void initializeRuntime(); + /** * Starts the JS application. If bundleRegistry is non-null, then it is * used to fetch JavaScript modules as individual scripts. * Otherwise, the script is assumed to include all the modules. */ - void loadApplication( + void loadBundle( std::unique_ptr bundleRegistry, std::unique_ptr startupCode, std::string sourceURL); - void loadApplicationSync( + void loadBundleSync( std::unique_ptr bundleRegistry, std::unique_ptr startupCode, std::string sourceURL); diff --git a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp index eaf7b71bc91bef..b8bb4191a0b0cd 100644 --- a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +++ b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp @@ -69,13 +69,8 @@ JSIExecutor::JSIExecutor( *runtime, "__jsiExecutorDescription", runtime->description()); } -void JSIExecutor::loadApplicationScript( - std::unique_ptr script, - std::string sourceURL) { - SystraceSection s("JSIExecutor::loadApplicationScript"); - - // TODO: check for and use precompiled HBC - +void JSIExecutor::initializeRuntime() { + SystraceSection s("JSIExecutor::initializeRuntime"); runtime_->global().setProperty( *runtime_, "nativeModuleProxy", @@ -133,6 +128,18 @@ void JSIExecutor::loadApplicationScript( if (runtimeInstaller_) { runtimeInstaller_(*runtime_); } + bool hasLogger(ReactMarker::logTaggedMarker); + if (hasLogger) { + ReactMarker::logMarker(ReactMarker::CREATE_REACT_CONTEXT_STOP); + } +} + +void JSIExecutor::loadBundle( + std::unique_ptr script, + std::string sourceURL) { + SystraceSection s("JSIExecutor::loadBundle"); + + // TODO: check for and use precompiled HBC bool hasLogger(ReactMarker::logTaggedMarker); std::string scriptName = simpleBasename(sourceURL); @@ -144,7 +151,6 @@ void JSIExecutor::loadApplicationScript( std::make_unique(std::move(script)), sourceURL); flush(); if (hasLogger) { - ReactMarker::logMarker(ReactMarker::CREATE_REACT_CONTEXT_STOP); ReactMarker::logTaggedMarker( ReactMarker::RUN_JS_BUNDLE_STOP, scriptName.c_str()); } diff --git a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h index cb4a7290f640db..ccc7360e9e985c 100644 --- a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +++ b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h @@ -77,7 +77,8 @@ class JSIExecutor : public JSExecutor { std::shared_ptr delegate, const JSIScopedTimeoutInvoker &timeoutInvoker, RuntimeInstaller runtimeInstaller); - void loadApplicationScript( + void initializeRuntime() override; + void loadBundle( std::unique_ptr script, std::string sourceURL) override; void setBundleRegistry(std::unique_ptr) override; From 4b115cb4c48ed590b429b4952e6ced351a1651c6 Mon Sep 17 00:00:00 2001 From: maciej simka Date: Thu, 23 Jan 2020 15:54:18 +0100 Subject: [PATCH 2/3] feat: Create bundle registry in Executor and pass bundle to register bundle --- React/CxxBridge/RCTCxxBridge.mm | 5 +- React/CxxBridge/RCTObjcExecutor.mm | 2 +- .../jni/react/jni/CatalystInstanceImpl.cpp | 3 +- .../src/main/jni/react/jni/ProxyExecutor.cpp | 2 +- .../src/main/jni/react/jni/ProxyExecutor.h | 2 +- ReactCommon/cxxreact/Instance.cpp | 26 ++++------ ReactCommon/cxxreact/Instance.h | 8 ++- ReactCommon/cxxreact/JSExecutor.h | 2 +- ReactCommon/cxxreact/NativeToJsBridge.cpp | 20 ++----- ReactCommon/cxxreact/NativeToJsBridge.h | 4 +- ReactCommon/cxxreact/RAMBundleRegistry.cpp | 52 +++++-------------- ReactCommon/cxxreact/RAMBundleRegistry.h | 15 +----- .../jsiexecutor/jsireact/JSIExecutor.cpp | 13 ++--- .../jsiexecutor/jsireact/JSIExecutor.h | 2 +- 14 files changed, 44 insertions(+), 112 deletions(-) diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index 69f9d248dd6fc8..75877e4a3cad7d 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -1328,8 +1328,7 @@ - (void)executeApplicationScript:(NSData *)script [self->_performanceLogger markStopForTag:RCTPLRAMBundleLoad]; [self->_performanceLogger setValue:scriptStr->size() forTag:RCTPLRAMStartupCodeSize]; if (self->_reactInstance) { - auto registry = RAMBundleRegistry::multipleBundlesRegistry(std::move(ramBundle), JSIndexedRAMBundle::buildFactory()); - self->_reactInstance->loadRAMBundle(std::move(registry), std::move(scriptStr), + self->_reactInstance->loadRAMBundle(std::move(ramBundle), std::move(scriptStr), sourceUrlStr.UTF8String, !async); } } else if (self->_reactInstance) { @@ -1345,7 +1344,7 @@ - (void)executeApplicationScript:(NSData *)script - (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path { if (_reactInstance) { - _reactInstance->registerBundle(static_cast(segmentId), path.UTF8String); + /* _reactInstance->registerBundle(static_cast(segmentId), path.UTF8String); */ } } diff --git a/React/CxxBridge/RCTObjcExecutor.mm b/React/CxxBridge/RCTObjcExecutor.mm index 7c4da26bf71d46..654bdb511a8cd8 100644 --- a/React/CxxBridge/RCTObjcExecutor.mm +++ b/React/CxxBridge/RCTObjcExecutor.mm @@ -101,7 +101,7 @@ void setBundleRegistry(std::unique_ptr) override { RCTAssert(NO, @"RAM bundles are not supported in RCTObjcExecutor"); } - void registerBundle(uint32_t __unused bundleId, const std::string __unused &bundlePath) override { + void registerBundle(uint32_t __unused bundleId, std::unique_ptr __unused) override { RCTAssert(NO, @"RAM bundles are not supported in RCTObjcExecutor"); } diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 924131081d60d5..17d56ec921cb88 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -216,9 +216,8 @@ void CatalystInstanceImpl::jniLoadScriptFromAssets( auto script = loadScriptFromAssets(manager, sourceURL); if (JniJSModulesUnbundle::isUnbundle(manager, sourceURL)) { auto bundle = JniJSModulesUnbundle::fromEntryFile(manager, sourceURL); - auto registry = RAMBundleRegistry::singleBundleRegistry(std::move(bundle)); instance_->loadRAMBundle( - std::move(registry), std::move(script), sourceURL, loadSynchronously); + std::move(bundle), std::move(script), sourceURL, loadSynchronously); return; } else if (Instance::isIndexedRAMBundle(&script)) { instance_->loadRAMBundleFromString(std::move(script), sourceURL); diff --git a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp index 37179ba5372fdf..d8c11f03789150 100644 --- a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp +++ b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp @@ -99,7 +99,7 @@ void ProxyExecutor::setBundleRegistry(std::unique_ptr) { void ProxyExecutor::registerBundle( uint32_t bundleId, - const std::string &bundlePath) { + std::unique_ptr bundle) { jni::throwNewJavaException( "java/lang/UnsupportedOperationException", "Loading application RAM bundles is not supported for proxy executors"); diff --git a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h index c9eab4170d41f4..f5ef305c8b166d 100644 --- a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h +++ b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h @@ -43,7 +43,7 @@ class ProxyExecutor : public JSExecutor { std::string sourceURL) override; virtual void setBundleRegistry( std::unique_ptr bundle) override; - virtual void registerBundle(uint32_t bundleId, const std::string &bundlePath) + virtual void registerBundle(uint32_t bundleId, std::unique_ptr bundle) override; virtual void callFunction( const std::string &moduleId, diff --git a/ReactCommon/cxxreact/Instance.cpp b/ReactCommon/cxxreact/Instance.cpp index 556208b0f0dba0..8133a53eb839b8 100644 --- a/ReactCommon/cxxreact/Instance.cpp +++ b/ReactCommon/cxxreact/Instance.cpp @@ -59,17 +59,15 @@ void Instance::initializeBridge( } void Instance::loadBundle( - std::unique_ptr bundleRegistry, std::unique_ptr string, std::string sourceURL) { callback_->incrementPendingJSCalls(); SystraceSection s("Instance::loadBundle", "sourceURL", sourceURL); nativeToJsBridge_->loadBundle( - std::move(bundleRegistry), std::move(string), std::move(sourceURL)); + std::move(string), std::move(sourceURL)); } void Instance::loadBundleSync( - std::unique_ptr bundleRegistry, std::unique_ptr string, std::string sourceURL) { std::unique_lock lock(m_syncMutex); @@ -77,14 +75,14 @@ void Instance::loadBundleSync( SystraceSection s("Instance::loadBundleSync", "sourceURL", sourceURL); nativeToJsBridge_->loadBundleSync( - std::move(bundleRegistry), std::move(string), std::move(sourceURL)); + std::move(string), std::move(sourceURL)); } void Instance::setSourceURL(std::string sourceURL) { callback_->incrementPendingJSCalls(); SystraceSection s("Instance::setSourceURL", "sourceURL", sourceURL); - nativeToJsBridge_->loadBundle(nullptr, nullptr, std::move(sourceURL)); + nativeToJsBridge_->loadBundle(nullptr, std::move(sourceURL)); } void Instance::loadScriptFromString( @@ -93,9 +91,9 @@ void Instance::loadScriptFromString( bool loadSynchronously) { SystraceSection s("Instance::loadScriptFromString", "sourceURL", sourceURL); if (loadSynchronously) { - loadBundleSync(nullptr, std::move(string), std::move(sourceURL)); + loadBundleSync(std::move(string), std::move(sourceURL)); } else { - loadBundle(nullptr, std::move(string), std::move(sourceURL)); + loadBundle(std::move(string), std::move(sourceURL)); } } @@ -126,8 +124,7 @@ void Instance::loadRAMBundleFromString( const std::string &sourceURL) { auto bundle = std::make_unique(std::move(script)); auto startupScript = bundle->getStartupCode(); - auto registry = RAMBundleRegistry::singleBundleRegistry(std::move(bundle)); - loadRAMBundle(std::move(registry), std::move(startupScript), sourceURL, true); + loadRAMBundle(std::move(bundle), std::move(startupScript), sourceURL, true); } void Instance::loadRAMBundleFromFile( @@ -136,28 +133,25 @@ void Instance::loadRAMBundleFromFile( bool loadSynchronously) { auto bundle = std::make_unique(sourcePath.c_str()); auto startupScript = bundle->getStartupCode(); - auto registry = RAMBundleRegistry::multipleBundlesRegistry( - std::move(bundle), JSIndexedRAMBundle::buildFactory()); loadRAMBundle( - std::move(registry), + std::move(bundle), std::move(startupScript), sourceURL, loadSynchronously); } void Instance::loadRAMBundle( - std::unique_ptr bundleRegistry, + std::unique_ptr bundle, std::unique_ptr startupScript, std::string startupScriptSourceURL, bool loadSynchronously) { + nativeToJsBridge_->registerBundle(0, std::move(bundle)); if (loadSynchronously) { loadBundleSync( - std::move(bundleRegistry), std::move(startupScript), std::move(startupScriptSourceURL)); } else { loadBundle( - std::move(bundleRegistry), std::move(startupScript), std::move(startupScriptSourceURL)); } @@ -201,7 +195,7 @@ void Instance::callJSCallback(uint64_t callbackId, folly::dynamic &¶ms) { void Instance::registerBundle( uint32_t bundleId, const std::string &bundlePath) { - nativeToJsBridge_->registerBundle(bundleId, bundlePath); + /* nativeToJsBridge_->registerBundle(bundleId, bundlePath); */ } const ModuleRegistry &Instance::getModuleRegistry() const { diff --git a/ReactCommon/cxxreact/Instance.h b/ReactCommon/cxxreact/Instance.h index 4dc0b6737af23b..2de5a0664c3d91 100644 --- a/ReactCommon/cxxreact/Instance.h +++ b/ReactCommon/cxxreact/Instance.h @@ -56,7 +56,7 @@ class RN_EXPORT Instance { void loadRAMBundleFromFile(const std::string& sourcePath, const std::string& sourceURL, bool loadSynchronously); - void loadRAMBundle(std::unique_ptr bundleRegistry, + void loadRAMBundle(std::unique_ptr bundle, std::unique_ptr startupScript, std::string startupScriptSourceURL, bool loadSynchronously); bool supportsProfiling(); @@ -81,11 +81,9 @@ class RN_EXPORT Instance { private: void callNativeModules(folly::dynamic &&calls, bool isEndOfBatch); - void loadBundle(std::unique_ptr bundleRegistry, - std::unique_ptr startupScript, + void loadBundle(std::unique_ptr startupScript, std::string startupScriptSourceURL); - void loadBundleSync(std::unique_ptr bundleRegistry, - std::unique_ptr startupScript, + void loadBundleSync(std::unique_ptr startupScript, std::string startupScriptSourceURL); std::shared_ptr callback_; diff --git a/ReactCommon/cxxreact/JSExecutor.h b/ReactCommon/cxxreact/JSExecutor.h index a70bd9e2eb0944..9dd5cb77ffd59a 100644 --- a/ReactCommon/cxxreact/JSExecutor.h +++ b/ReactCommon/cxxreact/JSExecutor.h @@ -71,7 +71,7 @@ class RN_EXPORT JSExecutor { /** * Register a file path for an additional "RAM" bundle */ - virtual void registerBundle(uint32_t bundleId, const std::string& bundlePath) = 0; + virtual void registerBundle(uint32_t bundleId, std::unique_ptr bundle) = 0; /** * Executes BatchedBridge.callFunctionReturnFlushedQueue with the module ID, diff --git a/ReactCommon/cxxreact/NativeToJsBridge.cpp b/ReactCommon/cxxreact/NativeToJsBridge.cpp index 2a9dce0d2e0f0a..cf32c51d1db5f0 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.cpp +++ b/ReactCommon/cxxreact/NativeToJsBridge.cpp @@ -116,19 +116,13 @@ void NativeToJsBridge::initializeRuntime() { } void NativeToJsBridge::loadBundle( - std::unique_ptr bundleRegistry, std::unique_ptr startupScript, std::string startupScriptSourceURL) { runOnExecutorQueue( [this, - bundleRegistryWrap = folly::makeMoveWrapper(std::move(bundleRegistry)), startupScript = folly::makeMoveWrapper(std::move(startupScript)), startupScriptSourceURL = std::move(startupScriptSourceURL)](JSExecutor *executor) mutable { - auto bundleRegistry = bundleRegistryWrap.move(); - if (bundleRegistry) { - executor->setBundleRegistry(std::move(bundleRegistry)); - } try { executor->loadBundle( std::move(*startupScript), std::move(startupScriptSourceURL)); @@ -140,12 +134,8 @@ void NativeToJsBridge::loadBundle( } void NativeToJsBridge::loadBundleSync( - std::unique_ptr bundleRegistry, std::unique_ptr startupScript, std::string startupScriptSourceURL) { - if (bundleRegistry) { - m_executor->setBundleRegistry(std::move(bundleRegistry)); - } try { m_executor->loadBundle( std::move(startupScript), std::move(startupScriptSourceURL)); @@ -225,13 +215,13 @@ void NativeToJsBridge::invokeCallback( executor->invokeCallback(callbackId, arguments); }); } - void NativeToJsBridge::registerBundle( uint32_t bundleId, - const std::string &bundlePath) { - runOnExecutorQueue([bundleId, bundlePath](JSExecutor *executor) { - executor->registerBundle(bundleId, bundlePath); - }); + std::unique_ptr bundle) { + runOnExecutorQueue([bundleId, bundle=folly::makeMoveWrapper(std::move(bundle))] + (JSExecutor* executor) mutable { + executor->registerBundle(bundleId, bundle.move()); + }); } void NativeToJsBridge::setGlobalVariable( diff --git a/ReactCommon/cxxreact/NativeToJsBridge.h b/ReactCommon/cxxreact/NativeToJsBridge.h index 46837f38bdd88a..47efc9702ffc1c 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.h +++ b/ReactCommon/cxxreact/NativeToJsBridge.h @@ -70,15 +70,13 @@ class NativeToJsBridge { * Otherwise, the script is assumed to include all the modules. */ void loadBundle( - std::unique_ptr bundleRegistry, std::unique_ptr startupCode, std::string sourceURL); void loadBundleSync( - std::unique_ptr bundleRegistry, std::unique_ptr startupCode, std::string sourceURL); - void registerBundle(uint32_t bundleId, const std::string& bundlePath); + void registerBundle(uint32_t bundleId, std::unique_ptr bundle); void setGlobalVariable(std::string propName, std::unique_ptr jsonValue); void* getJavaScriptContext(); bool isInspectable(); diff --git a/ReactCommon/cxxreact/RAMBundleRegistry.cpp b/ReactCommon/cxxreact/RAMBundleRegistry.cpp index c19110c9ce12f8..66c389c7d8121d 100644 --- a/ReactCommon/cxxreact/RAMBundleRegistry.cpp +++ b/ReactCommon/cxxreact/RAMBundleRegistry.cpp @@ -16,58 +16,30 @@ namespace react { constexpr uint32_t RAMBundleRegistry::MAIN_BUNDLE_ID; -std::unique_ptr RAMBundleRegistry::singleBundleRegistry( - std::unique_ptr mainBundle) { - return std::make_unique(std::move(mainBundle)); -} - -std::unique_ptr RAMBundleRegistry::multipleBundlesRegistry( - std::unique_ptr mainBundle, - std::function(std::string)> factory) { - return std::make_unique( - std::move(mainBundle), std::move(factory)); -} - -RAMBundleRegistry::RAMBundleRegistry( - std::unique_ptr mainBundle, - std::function(std::string)> factory) - : m_factory(std::move(factory)) { +RAMBundleRegistry::RAMBundleRegistry(std::unique_ptr mainBundle) { m_bundles.emplace(MAIN_BUNDLE_ID, std::move(mainBundle)); } void RAMBundleRegistry::registerBundle( uint32_t bundleId, - std::string bundlePath) { - m_bundlePaths.emplace(bundleId, std::move(bundlePath)); + std::unique_ptr bundle) { + if (m_bundles.find(bundleId) != m_bundles.end()) { + throw std::runtime_error( + folly::to("Bundle with id - ", bundleId, " already exists") + ); + } + m_bundles.emplace(bundleId, std::move(bundle)); } JSModulesUnbundle::Module RAMBundleRegistry::getModule( uint32_t bundleId, uint32_t moduleId) { if (m_bundles.find(bundleId) == m_bundles.end()) { - if (!m_factory) { - throw std::runtime_error( - "You need to register factory function in order to " - "support multiple RAM bundles."); - } - - auto bundlePath = m_bundlePaths.find(bundleId); - if (bundlePath == m_bundlePaths.end()) { - throw std::runtime_error( - "In order to fetch RAM bundle from the registry, its file " - "path needs to be registered first."); - } - m_bundles.emplace(bundleId, m_factory(bundlePath->second)); - } - - auto module = getBundle(bundleId)->getModule(moduleId); - if (bundleId == MAIN_BUNDLE_ID) { - return module; + throw std::runtime_error( + folly::to("Couldn't find bundle with id - ", bundleId) + ); } - return { - folly::to("seg-", bundleId, '_', std::move(module.name)), - std::move(module.code), - }; + return getBundle(bundleId)->getModule(moduleId); } JSModulesUnbundle *RAMBundleRegistry::getBundle(uint32_t bundleId) const { diff --git a/ReactCommon/cxxreact/RAMBundleRegistry.h b/ReactCommon/cxxreact/RAMBundleRegistry.h index e507172f67e8af..0ab01c7a25faeb 100644 --- a/ReactCommon/cxxreact/RAMBundleRegistry.h +++ b/ReactCommon/cxxreact/RAMBundleRegistry.h @@ -26,28 +26,17 @@ class RN_EXPORT RAMBundleRegistry { public: constexpr static uint32_t MAIN_BUNDLE_ID = 0; - static std::unique_ptr singleBundleRegistry( - std::unique_ptr mainBundle); - static std::unique_ptr multipleBundlesRegistry( - std::unique_ptr mainBundle, - std::function(std::string)> factory); - - explicit RAMBundleRegistry( - std::unique_ptr mainBundle, - std::function< - std::unique_ptr(std::string)> factory = nullptr); + RAMBundleRegistry(std::unique_ptr mainBundle); RAMBundleRegistry(RAMBundleRegistry&&) = default; RAMBundleRegistry& operator=(RAMBundleRegistry&&) = default; - void registerBundle(uint32_t bundleId, std::string bundlePath); + void registerBundle(uint32_t bundleId, std::unique_ptr bundle); JSModulesUnbundle::Module getModule(uint32_t bundleId, uint32_t moduleId); virtual ~RAMBundleRegistry() {}; private: JSModulesUnbundle* getBundle(uint32_t bundleId) const; - std::function(std::string)> m_factory; - std::unordered_map m_bundlePaths; std::unordered_map> m_bundles; }; diff --git a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp index b8bb4191a0b0cd..5d86109c0dfa07 100644 --- a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +++ b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp @@ -176,21 +176,14 @@ void JSIExecutor::setBundleRegistry(std::unique_ptr r) { void JSIExecutor::registerBundle( uint32_t bundleId, - const std::string &bundlePath) { + std::unique_ptr bundle) { const auto tag = folly::to(bundleId); ReactMarker::logTaggedMarker( ReactMarker::REGISTER_JS_SEGMENT_START, tag.c_str()); if (bundleRegistry_) { - bundleRegistry_->registerBundle(bundleId, bundlePath); + bundleRegistry_->registerBundle(bundleId, std::move(bundle)); } else { - auto script = JSBigFileString::fromPath(bundlePath); - if (script->size() == 0) { - throw std::invalid_argument( - "Empty bundle registered with ID " + tag + " from " + bundlePath); - } - runtime_->evaluateJavaScript( - std::make_unique(std::move(script)), - JSExecutor::getSyntheticBundlePath(bundleId, bundlePath)); + setBundleRegistry(std::make_unique(std::move(bundle))); } ReactMarker::logTaggedMarker( ReactMarker::REGISTER_JS_SEGMENT_STOP, tag.c_str()); diff --git a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h index ccc7360e9e985c..9efd2e1e3c0d78 100644 --- a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +++ b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h @@ -82,7 +82,7 @@ class JSIExecutor : public JSExecutor { std::unique_ptr script, std::string sourceURL) override; void setBundleRegistry(std::unique_ptr) override; - void registerBundle(uint32_t bundleId, const std::string &bundlePath) + void registerBundle(uint32_t bundleId, std::unique_ptr bundle) override; void callFunction( const std::string &moduleId, From b7d33b9dbb4a973ffc0b8111f93bf1f0bc89c31d Mon Sep 17 00:00:00 2001 From: maciej simka Date: Mon, 27 Jan 2020 15:17:44 +0100 Subject: [PATCH 3/3] feat: add bundleId --- React/CxxBridge/RCTCxxBridge.mm | 18 ++++++++++-------- .../react/bridge/CatalystInstanceImpl.java | 12 ++++++------ .../facebook/react/bridge/JSBundleLoader.java | 6 +++--- .../react/bridge/JSBundleLoaderDelegate.java | 6 ++++-- .../jni/react/jni/CatalystInstanceImpl.cpp | 8 +++++--- .../main/jni/react/jni/CatalystInstanceImpl.h | 17 ++++++++--------- ReactCommon/cxxreact/Instance.cpp | 15 ++++++++++++--- ReactCommon/cxxreact/Instance.h | 9 +++++++-- 8 files changed, 55 insertions(+), 36 deletions(-) diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index 75877e4a3cad7d..28b72235d4f6de 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -384,7 +384,7 @@ - (void)start dispatch_group_notify(prepareBridge, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{ RCTCxxBridge *strongSelf = weakSelf; if (sourceCode && strongSelf.loading) { - [strongSelf executeSourceCode:sourceCode sync:NO]; + [strongSelf executeSourceCode:sourceCode bundleId:0 sync:NO]; } }); RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @""); @@ -880,7 +880,7 @@ - (void)registerModuleForFrameUpdates:(id)module [_displayLink registerModuleForFrameUpdates:module withModuleData:moduleData]; } -- (void)executeSourceCode:(NSData *)sourceCode sync:(BOOL)sync +- (void)executeSourceCode:(NSData *)sourceCode bundleId:(int)bundleId sync:(BOOL)sync { // This will get called from whatever thread was actually executing JS. dispatch_block_t completion = ^{ @@ -905,10 +905,10 @@ - (void)executeSourceCode:(NSData *)sourceCode sync:(BOOL)sync }; if (sync) { - [self executeApplicationScriptSync:sourceCode url:self.bundleURL]; + [self executeApplicationScriptSync:sourceCode url:self.bundleURL bundleId:bundleId]; completion(); } else { - [self enqueueApplicationScript:sourceCode url:self.bundleURL onComplete:completion]; + [self enqueueApplicationScript:sourceCode url:self.bundleURL bundleId:bundleId onComplete:completion]; } if (self.devSettings.isHotLoadingAvailable) { @@ -1292,11 +1292,12 @@ - (void)_immediatelyCallTimer:(NSNumber *)timer - (void)enqueueApplicationScript:(NSData *)script url:(NSURL *)url + bundleId:(uint32_t)bundleId onComplete:(dispatch_block_t)onComplete { RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTCxxBridge enqueueApplicationScript]", nil); - [self executeApplicationScript:script url:url async:YES]; + [self executeApplicationScript:script url:url bundleId:bundleId async:YES]; RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @""); @@ -1307,13 +1308,14 @@ - (void)enqueueApplicationScript:(NSData *)script } } -- (void)executeApplicationScriptSync:(NSData *)script url:(NSURL *)url +- (void)executeApplicationScriptSync:(NSData *)script url:(NSURL *)url bundleId:(uint32_t)bundleId { - [self executeApplicationScript:script url:url async:NO]; + [self executeApplicationScript:script url:url bundleId:bundleId async:NO]; } - (void)executeApplicationScript:(NSData *)script url:(NSURL *)url + bundleId:(uint32_t)bundleId async:(BOOL)async { [self _tryAndHandleError:^{ @@ -1329,7 +1331,7 @@ - (void)executeApplicationScript:(NSData *)script [self->_performanceLogger setValue:scriptStr->size() forTag:RCTPLRAMStartupCodeSize]; if (self->_reactInstance) { self->_reactInstance->loadRAMBundle(std::move(ramBundle), std::move(scriptStr), - sourceUrlStr.UTF8String, !async); + sourceUrlStr.UTF8String, bundleId, !async); } } else if (self->_reactInstance) { self->_reactInstance->loadScriptFromString(std::make_unique(script), diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index 0822837e5a5c34..6a46acb519c0ac 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -230,15 +230,15 @@ public void registerSegment(int segmentId, String path) { @Override public void loadScriptFromAssets( - AssetManager assetManager, String assetURL, boolean loadSynchronously) { + AssetManager assetManager, String assetURL, int bundleId, boolean loadSynchronously) { mSourceURL = assetURL; - jniLoadScriptFromAssets(assetManager, assetURL, loadSynchronously); + jniLoadScriptFromAssets(assetManager, assetURL, bundleId, loadSynchronously); } @Override - public void loadScriptFromFile(String fileName, String sourceURL, boolean loadSynchronously) { + public void loadScriptFromFile(String fileName, String sourceURL, int bundleId, boolean loadSynchronously) { mSourceURL = sourceURL; - jniLoadScriptFromFile(fileName, sourceURL, loadSynchronously); + jniLoadScriptFromFile(fileName, sourceURL, bundleId, loadSynchronously); } private native void jniSetSourceURL(String sourceURL); @@ -246,10 +246,10 @@ public void loadScriptFromFile(String fileName, String sourceURL, boolean loadSy private native void jniRegisterSegment(int segmentId, String path); private native void jniLoadScriptFromAssets( - AssetManager assetManager, String assetURL, boolean loadSynchronously); + AssetManager assetManager, String assetURL, int bundleId, boolean loadSynchronously); private native void jniLoadScriptFromFile( - String fileName, String sourceURL, boolean loadSynchronously); + String fileName, String sourceURL, int bundleId, boolean loadSynchronously); @Override public void runJSBundle() { diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java index d8d577b1aa6ea6..c8d941c8c12cd9 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java @@ -26,7 +26,7 @@ public static JSBundleLoader createAssetLoader( return new JSBundleLoader() { @Override public String loadScript(JSBundleLoaderDelegate delegate) { - delegate.loadScriptFromAssets(context.getAssets(), assetUrl, loadSynchronously); + delegate.loadScriptFromAssets(context.getAssets(), assetUrl, 0, loadSynchronously); return assetUrl; } }; @@ -45,7 +45,7 @@ public static JSBundleLoader createFileLoader( return new JSBundleLoader() { @Override public String loadScript(JSBundleLoaderDelegate delegate) { - delegate.loadScriptFromFile(fileName, assetUrl, loadSynchronously); + delegate.loadScriptFromFile(fileName, assetUrl, 0, loadSynchronously); return fileName; } }; @@ -64,7 +64,7 @@ public static JSBundleLoader createCachedBundleFromNetworkLoader( @Override public String loadScript(JSBundleLoaderDelegate delegate) { try { - delegate.loadScriptFromFile(cachedFileLocation, sourceURL, false); + delegate.loadScriptFromFile(cachedFileLocation, sourceURL, 0, false); return sourceURL; } catch (Exception e) { throw DebugServerException.makeGeneric(sourceURL, e.getMessage(), e); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java index 7b2121f5a26438..6c349453eb0bdf 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoaderDelegate.java @@ -19,9 +19,10 @@ public interface JSBundleLoaderDelegate { * * @param assetManager * @param assetURL + * @param bundleId * @param loadSynchronously */ - void loadScriptFromAssets(AssetManager assetManager, String assetURL, boolean loadSynchronously); + void loadScriptFromAssets(AssetManager assetManager, String assetURL, int bundleId, boolean loadSynchronously); /** * Load a JS bundle from the filesystem. See {@link JSBundleLoader#createFileLoader(String)} and @@ -29,9 +30,10 @@ public interface JSBundleLoaderDelegate { * * @param fileName * @param sourceURL + * @param bundleId * @param loadSynchronously */ - void loadScriptFromFile(String fileName, String sourceURL, boolean loadSynchronously); + void loadScriptFromFile(String fileName, String sourceURL, int bundleId, boolean loadSynchronously); /** * This API is used in situations where the JS bundle is being executed not on the device, but on diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 17d56ec921cb88..8f87d9659a07d0 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -208,6 +208,7 @@ void CatalystInstanceImpl::jniRegisterSegment( void CatalystInstanceImpl::jniLoadScriptFromAssets( jni::alias_ref assetManager, const std::string &assetURL, + int bundleId, bool loadSynchronously) { const int kAssetsLength = 9; // strlen("assets://"); auto sourceURL = assetURL.substr(kAssetsLength); @@ -217,10 +218,10 @@ void CatalystInstanceImpl::jniLoadScriptFromAssets( if (JniJSModulesUnbundle::isUnbundle(manager, sourceURL)) { auto bundle = JniJSModulesUnbundle::fromEntryFile(manager, sourceURL); instance_->loadRAMBundle( - std::move(bundle), std::move(script), sourceURL, loadSynchronously); + std::move(bundle), std::move(script), sourceURL, (uint32_t)bundleId, loadSynchronously); return; } else if (Instance::isIndexedRAMBundle(&script)) { - instance_->loadRAMBundleFromString(std::move(script), sourceURL); + instance_->loadRAMBundleFromString(std::move(script), sourceURL, (uint32_t)bundleId); } else { instance_->loadScriptFromString( std::move(script), sourceURL, loadSynchronously); @@ -230,9 +231,10 @@ void CatalystInstanceImpl::jniLoadScriptFromAssets( void CatalystInstanceImpl::jniLoadScriptFromFile( const std::string &fileName, const std::string &sourceURL, + int bundleId, bool loadSynchronously) { if (Instance::isIndexedRAMBundle(fileName.c_str())) { - instance_->loadRAMBundleFromFile(fileName, sourceURL, loadSynchronously); + instance_->loadRAMBundleFromFile(fileName, sourceURL, (uint32_t)bundleId, loadSynchronously); } else { std::unique_ptr script; RecoverableError::runRethrowingAsRecoverable( diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index 94d50e245fb9fe..340fdc150439b5 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -77,15 +77,14 @@ class CatalystInstanceImpl : public jni::HybridClass { * */ void jniRegisterSegment(int segmentId, const std::string &path); - - void jniLoadScriptFromAssets( - jni::alias_ref assetManager, - const std::string &assetURL, - bool loadSynchronously); - void jniLoadScriptFromFile( - const std::string &fileName, - const std::string &sourceURL, - bool loadSynchronously); + void jniLoadScriptFromAssets(jni::alias_ref assetManager, + const std::string& assetURL, + int bundleId, + bool loadSynchronously); + void jniLoadScriptFromFile(const std::string& fileName, + const std::string& sourceURL, + int bundleId, + bool loadSynchronously); void jniCallJSFunction( std::string module, std::string method, diff --git a/ReactCommon/cxxreact/Instance.cpp b/ReactCommon/cxxreact/Instance.cpp index 8133a53eb839b8..b84fefec5b2cad 100644 --- a/ReactCommon/cxxreact/Instance.cpp +++ b/ReactCommon/cxxreact/Instance.cpp @@ -121,15 +121,22 @@ bool Instance::isIndexedRAMBundle(std::unique_ptr *script) { void Instance::loadRAMBundleFromString( std::unique_ptr script, - const std::string &sourceURL) { + const std::string& sourceURL, + uint32_t bundleId) { auto bundle = std::make_unique(std::move(script)); auto startupScript = bundle->getStartupCode(); - loadRAMBundle(std::move(bundle), std::move(startupScript), sourceURL, true); + loadRAMBundle( + std::move(bundle), + std::move(startupScript), + sourceURL, + bundleId, + true); } void Instance::loadRAMBundleFromFile( const std::string &sourcePath, const std::string &sourceURL, + uint32_t bundleId, bool loadSynchronously) { auto bundle = std::make_unique(sourcePath.c_str()); auto startupScript = bundle->getStartupCode(); @@ -137,6 +144,7 @@ void Instance::loadRAMBundleFromFile( std::move(bundle), std::move(startupScript), sourceURL, + bundleId, loadSynchronously); } @@ -144,8 +152,9 @@ void Instance::loadRAMBundle( std::unique_ptr bundle, std::unique_ptr startupScript, std::string startupScriptSourceURL, + uint32_t bundleId, bool loadSynchronously) { - nativeToJsBridge_->registerBundle(0, std::move(bundle)); + nativeToJsBridge_->registerBundle(bundleId, std::move(bundle)); if (loadSynchronously) { loadBundleSync( std::move(startupScript), diff --git a/ReactCommon/cxxreact/Instance.h b/ReactCommon/cxxreact/Instance.h index 2de5a0664c3d91..5482d16cd82c58 100644 --- a/ReactCommon/cxxreact/Instance.h +++ b/ReactCommon/cxxreact/Instance.h @@ -52,13 +52,18 @@ class RN_EXPORT Instance { std::string sourceURL, bool loadSynchronously); static bool isIndexedRAMBundle(const char *sourcePath); static bool isIndexedRAMBundle(std::unique_ptr* string); - void loadRAMBundleFromString(std::unique_ptr script, const std::string& sourceURL); + void loadRAMBundleFromString(std::unique_ptr script, + const std::string& sourceURL, + uint32_t bundleId); void loadRAMBundleFromFile(const std::string& sourcePath, const std::string& sourceURL, + uint32_t bundleId, bool loadSynchronously); void loadRAMBundle(std::unique_ptr bundle, std::unique_ptr startupScript, - std::string startupScriptSourceURL, bool loadSynchronously); + std::string startupScriptSourceURL, + uint32_t bundleId, + bool loadSynchronously); bool supportsProfiling(); void setGlobalVariable(std::string propName, std::unique_ptr jsonValue);