From 9e00a42fd7067dbb8a17a8c8b6262d0aeb814b84 Mon Sep 17 00:00:00 2001 From: Ashok Menon Date: Fri, 18 Nov 2016 05:01:09 -0800 Subject: [PATCH] Experimental App Bundle API Reviewed By: michalgr Differential Revision: D4198629 fbshipit-source-id: b96a4b3ad3e5ab6b4cb8892442c6077edf7058a3 --- ReactCommon/cxxreact/Executor.cpp | 8 ++++++++ ReactCommon/cxxreact/Executor.h | 14 +++++++++++++- ReactCommon/cxxreact/JSCExecutor.cpp | 29 ++++++++++++++++++++++++++++ ReactCommon/cxxreact/JSCExecutor.h | 17 ++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/ReactCommon/cxxreact/Executor.cpp b/ReactCommon/cxxreact/Executor.cpp index 54ae86f0d..1fec2ca21 100644 --- a/ReactCommon/cxxreact/Executor.cpp +++ b/ReactCommon/cxxreact/Executor.cpp @@ -22,6 +22,14 @@ void JSExecutor::loadApplicationScript(std::string bundlePath, std::string sourc std::move(sourceURL)); } +void JSExecutor::loadApplicationScript(int fd, std::string sourceURL) { + struct stat fileInfo; + folly::checkUnixError(::fstat(fd, &fileInfo), "fstat on bundle failed."); + + auto bundle = folly::make_unique(fd, fileInfo.st_size); + return loadApplicationScript(std::move(bundle), std::move(sourceURL)); +} + static JSBigOptimizedBundleString::Encoding encodingFromByte(uint8_t byte) { switch (byte) { case 0: diff --git a/ReactCommon/cxxreact/Executor.h b/ReactCommon/cxxreact/Executor.h index 6f2f83fdc..7120c15c1 100644 --- a/ReactCommon/cxxreact/Executor.h +++ b/ReactCommon/cxxreact/Executor.h @@ -182,7 +182,11 @@ public: const char *c_str() const override { if (!m_data) { m_data = (const char *)mmap(0, m_size, PROT_READ, MAP_SHARED, m_fd, m_mapOff); - CHECK(m_data != MAP_FAILED); + CHECK(m_data != MAP_FAILED) + << " fd: " << m_fd + << " size: " << m_size + << " offset: " << m_mapOff + << " error: " << std::strerror(errno); } return m_data + m_pageOff; } @@ -279,6 +283,14 @@ public: */ virtual void loadApplicationScript(std::string bundlePath, std::string source, int flags); + /** + * @experimental + * + * Read an app bundle from a file descriptor, determine how it should be + * loaded, load and execute it in the JS context. + */ + virtual void loadApplicationScript(int fd, std::string source); + /** * Add an application "unbundle" file */ diff --git a/ReactCommon/cxxreact/JSCExecutor.cpp b/ReactCommon/cxxreact/JSCExecutor.cpp index 1f9b3bee8..f84dd637f 100644 --- a/ReactCommon/cxxreact/JSCExecutor.cpp +++ b/ReactCommon/cxxreact/JSCExecutor.cpp @@ -363,6 +363,35 @@ void JSCExecutor::loadApplicationScript( } #endif +#ifdef WITH_FBJSCEXTENSIONS +void JSCExecutor::loadApplicationScript( + int fd, + std::string sourceURL) +{ + String jsSourceURL {sourceURL.c_str()}; + + auto bcSourceCode = JSCreateCompiledSourceCode(fd, jsSourceURL); + if (!bcSourceCode) { + // Not bytecode, fall through. + return JSExecutor::loadApplicationScript(fd, sourceURL); + } + + ReactMarker::logMarker("RUN_JS_BUNDLE_START"); + + evaluateSourceCode(m_context, bcSourceCode, jsSourceURL); + + // TODO(luk): t13903306 Remove this check once we make native modules + // working for java2js + if (m_delegate) { + bindBridge(); + flush(); + } + + ReactMarker::logMarker("CREATE_REACT_CONTEXT_END"); + ReactMarker::logMarker("RUN_JS_BUNDLE_END"); +} +#endif + void JSCExecutor::loadApplicationScript(std::unique_ptr script, std::string sourceURL) throw(JSException) { SystraceSection s("JSCExecutor::loadApplicationScript", "sourceURL", sourceURL); diff --git a/ReactCommon/cxxreact/JSCExecutor.h b/ReactCommon/cxxreact/JSCExecutor.h index 7aaf944ce..fd1333f1d 100644 --- a/ReactCommon/cxxreact/JSCExecutor.h +++ b/ReactCommon/cxxreact/JSCExecutor.h @@ -63,38 +63,55 @@ public: virtual void loadApplicationScript( std::unique_ptr script, std::string sourceURL) throw(JSException) override; + #ifdef WITH_FBJSCEXTENSIONS virtual void loadApplicationScript( std::string bundlePath, std::string sourceURL, int flags) override; #endif + +#ifdef WITH_FBJSCEXTENSIONS + virtual void loadApplicationScript( + int fd, + std::string sourceURL) override; +#endif + virtual void setJSModulesUnbundle( std::unique_ptr unbundle) override; + virtual void callFunction( const std::string& moduleId, const std::string& methodId, const folly::dynamic& arguments) override; + virtual void invokeCallback( const double callbackId, const folly::dynamic& arguments) override; + template Value callFunctionSync( const std::string& module, const std::string& method, T&& args) { return callFunctionSyncWithValue(module, method, toValue(m_context, std::forward(args))); } + virtual void setGlobalVariable( std::string propName, std::unique_ptr jsonValue) override; + virtual void* getJavaScriptContext() override; + virtual bool supportsProfiling() override; virtual void startProfiler(const std::string &titleString) override; virtual void stopProfiler(const std::string &titleString, const std::string &filename) override; + virtual void handleMemoryPressureUiHidden() override; virtual void handleMemoryPressureModerate() override; virtual void handleMemoryPressureCritical() override; + virtual void destroy() override; + void setContextName(const std::string& name); private: