Deleting Optimized Bundle!
Reviewed By: javache Differential Revision: D4566164 fbshipit-source-id: 1fbd3dd04f24399e93e3c6ec58956e6e18f1683f
This commit is contained in:
parent
7c97008fa8
commit
14dc219810
|
@ -208,15 +208,9 @@ public class CatalystInstanceImpl implements CatalystInstance {
|
||||||
jniLoadScriptFromFile(fileName, sourceURL);
|
jniLoadScriptFromFile(fileName, sourceURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* package */ void loadScriptFromOptimizedBundle(String path, String sourceURL, int flags) {
|
|
||||||
mSourceURL = sourceURL;
|
|
||||||
jniLoadScriptFromOptimizedBundle(path, sourceURL, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
private native void jniSetSourceURL(String sourceURL);
|
private native void jniSetSourceURL(String sourceURL);
|
||||||
private native void jniLoadScriptFromAssets(AssetManager assetManager, String assetURL);
|
private native void jniLoadScriptFromAssets(AssetManager assetManager, String assetURL);
|
||||||
private native void jniLoadScriptFromFile(String fileName, String sourceURL);
|
private native void jniLoadScriptFromFile(String fileName, String sourceURL);
|
||||||
private native void jniLoadScriptFromOptimizedBundle(String path, String sourceURL, int flags);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void runJSBundle() {
|
public void runJSBundle() {
|
||||||
|
|
|
@ -105,8 +105,6 @@ void CatalystInstanceImpl::registerNatives() {
|
||||||
makeNativeMethod("jniSetSourceURL", CatalystInstanceImpl::jniSetSourceURL),
|
makeNativeMethod("jniSetSourceURL", CatalystInstanceImpl::jniSetSourceURL),
|
||||||
makeNativeMethod("jniLoadScriptFromAssets", CatalystInstanceImpl::jniLoadScriptFromAssets),
|
makeNativeMethod("jniLoadScriptFromAssets", CatalystInstanceImpl::jniLoadScriptFromAssets),
|
||||||
makeNativeMethod("jniLoadScriptFromFile", CatalystInstanceImpl::jniLoadScriptFromFile),
|
makeNativeMethod("jniLoadScriptFromFile", CatalystInstanceImpl::jniLoadScriptFromFile),
|
||||||
makeNativeMethod("jniLoadScriptFromOptimizedBundle",
|
|
||||||
CatalystInstanceImpl::jniLoadScriptFromOptimizedBundle),
|
|
||||||
makeNativeMethod("jniCallJSFunction", CatalystInstanceImpl::jniCallJSFunction),
|
makeNativeMethod("jniCallJSFunction", CatalystInstanceImpl::jniCallJSFunction),
|
||||||
makeNativeMethod("jniCallJSCallback", CatalystInstanceImpl::jniCallJSCallback),
|
makeNativeMethod("jniCallJSCallback", CatalystInstanceImpl::jniCallJSCallback),
|
||||||
makeNativeMethod("getMainExecutorToken", CatalystInstanceImpl::getMainExecutorToken),
|
makeNativeMethod("getMainExecutorToken", CatalystInstanceImpl::getMainExecutorToken),
|
||||||
|
@ -217,14 +215,6 @@ void CatalystInstanceImpl::jniLoadScriptFromFile(const std::string& fileName,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CatalystInstanceImpl::jniLoadScriptFromOptimizedBundle(const std::string& bundlePath,
|
|
||||||
const std::string& sourceURL,
|
|
||||||
jint flags) {
|
|
||||||
return instance_->loadScriptFromOptimizedBundle(std::move(bundlePath),
|
|
||||||
std::move(sourceURL),
|
|
||||||
flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CatalystInstanceImpl::jniCallJSFunction(
|
void CatalystInstanceImpl::jniCallJSFunction(
|
||||||
JExecutorToken* token, std::string module, std::string method, NativeArray* arguments) {
|
JExecutorToken* token, std::string module, std::string method, NativeArray* arguments) {
|
||||||
// We want to share the C++ code, and on iOS, modules pass module/method
|
// We want to share the C++ code, and on iOS, modules pass module/method
|
||||||
|
|
|
@ -57,7 +57,6 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
|
||||||
|
|
||||||
void jniLoadScriptFromAssets(jni::alias_ref<JAssetManager::javaobject> assetManager, const std::string& assetURL);
|
void jniLoadScriptFromAssets(jni::alias_ref<JAssetManager::javaobject> assetManager, const std::string& assetURL);
|
||||||
void jniLoadScriptFromFile(const std::string& fileName, const std::string& sourceURL);
|
void jniLoadScriptFromFile(const std::string& fileName, const std::string& sourceURL);
|
||||||
void jniLoadScriptFromOptimizedBundle(const std::string& bundlePath, const std::string& sourceURL, jint flags);
|
|
||||||
void jniCallJSFunction(JExecutorToken* token, std::string module, std::string method, NativeArray* arguments);
|
void jniCallJSFunction(JExecutorToken* token, std::string module, std::string method, NativeArray* arguments);
|
||||||
void jniCallJSCallback(JExecutorToken* token, jint callbackId, NativeArray* arguments);
|
void jniCallJSCallback(JExecutorToken* token, jint callbackId, NativeArray* arguments);
|
||||||
local_ref<JExecutorToken::JavaPart> getMainExecutorToken();
|
local_ref<JExecutorToken::JavaPart> getMainExecutorToken();
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
|
||||||
|
|
||||||
#include "Executor.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <fstream>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <folly/Memory.h>
|
|
||||||
#include <folly/ScopeGuard.h>
|
|
||||||
|
|
||||||
namespace facebook {
|
|
||||||
namespace react {
|
|
||||||
|
|
||||||
void JSExecutor::loadApplicationScript(std::string bundlePath, std::string sourceURL, int flags) {
|
|
||||||
if ((flags & UNPACKED_JS_SOURCE) == 0) {
|
|
||||||
throw std::runtime_error("No unpacked js source file");
|
|
||||||
}
|
|
||||||
return loadApplicationScript(
|
|
||||||
JSBigOptimizedBundleString::fromOptimizedBundle(bundlePath),
|
|
||||||
std::move(sourceURL));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<const JSBigFileString> JSBigFileString::fromPath(const std::string& sourceURL) {
|
|
||||||
int fd = ::open(sourceURL.c_str(), O_RDONLY);
|
|
||||||
folly::checkUnixError(fd, "Could not open file", sourceURL);
|
|
||||||
SCOPE_EXIT { CHECK(::close(fd) == 0); };
|
|
||||||
|
|
||||||
struct stat fileInfo;
|
|
||||||
folly::checkUnixError(::fstat(fd, &fileInfo), "fstat on bundle failed.");
|
|
||||||
|
|
||||||
return folly::make_unique<const JSBigFileString>(fd, fileInfo.st_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static JSBigOptimizedBundleString::Encoding encodingFromByte(uint8_t byte) {
|
|
||||||
switch (byte) {
|
|
||||||
case 0:
|
|
||||||
return JSBigOptimizedBundleString::Encoding::Unknown;
|
|
||||||
case 1:
|
|
||||||
return JSBigOptimizedBundleString::Encoding::Ascii;
|
|
||||||
case 2:
|
|
||||||
return JSBigOptimizedBundleString::Encoding::Utf8;
|
|
||||||
case 3:
|
|
||||||
return JSBigOptimizedBundleString::Encoding::Utf16;
|
|
||||||
default:
|
|
||||||
throw std::invalid_argument("Unknown bundle encoding");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<const JSBigOptimizedBundleString> JSBigOptimizedBundleString::fromOptimizedBundle(
|
|
||||||
const std::string& bundlePath) {
|
|
||||||
uint8_t sha1[20];
|
|
||||||
uint8_t encoding;
|
|
||||||
struct stat fileInfo;
|
|
||||||
int fd = -1;
|
|
||||||
SCOPE_EXIT { CHECK(fd == -1 || ::close(fd) == 0); };
|
|
||||||
|
|
||||||
{
|
|
||||||
auto metaPath = bundlePath + UNPACKED_META_PATH_SUFFIX;
|
|
||||||
std::ifstream metaFile;
|
|
||||||
metaFile.exceptions(std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit);
|
|
||||||
metaFile.open(metaPath, std::ifstream::in | std::ifstream::binary);
|
|
||||||
metaFile.read(reinterpret_cast<char*>(sha1), sizeof(sha1));
|
|
||||||
metaFile.read(reinterpret_cast<char*>(&encoding), sizeof(encoding));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
auto sourcePath = bundlePath + UNPACKED_JS_SOURCE_PATH_SUFFIX;
|
|
||||||
fd = ::open(sourcePath.c_str(), O_RDONLY);
|
|
||||||
folly::checkUnixError(fd, "could not open js bundle file.");
|
|
||||||
}
|
|
||||||
|
|
||||||
folly::checkUnixError(::fstat(fd, &fileInfo), "fstat on js bundle failed.");
|
|
||||||
|
|
||||||
return folly::make_unique<const JSBigOptimizedBundleString>(
|
|
||||||
fd,
|
|
||||||
fileInfo.st_size,
|
|
||||||
sha1,
|
|
||||||
encodingFromByte(encoding));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace react
|
|
||||||
} // namespace facebook
|
|
|
@ -66,11 +66,6 @@ public:
|
||||||
virtual void loadApplicationScript(std::unique_ptr<const JSBigString> script,
|
virtual void loadApplicationScript(std::unique_ptr<const JSBigString> script,
|
||||||
std::string sourceURL) = 0;
|
std::string sourceURL) = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute an application script optimized bundle in the JS context.
|
|
||||||
*/
|
|
||||||
virtual void loadApplicationScript(std::string bundlePath, std::string source, int flags);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an application "unbundle" file
|
* Add an application "unbundle" file
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -90,16 +90,6 @@ void Instance::loadScriptFromFile(const std::string& filename,
|
||||||
nativeToJsBridge_->loadApplication(nullptr, std::move(script), sourceURL);
|
nativeToJsBridge_->loadApplication(nullptr, std::move(script), sourceURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Instance::loadScriptFromOptimizedBundle(std::string bundlePath,
|
|
||||||
std::string sourceURL,
|
|
||||||
int flags) {
|
|
||||||
SystraceSection s("reactbridge_xplat_loadScriptFromOptimizedBundle",
|
|
||||||
"bundlePath", bundlePath);
|
|
||||||
nativeToJsBridge_->loadOptimizedApplicationScript(std::move(bundlePath),
|
|
||||||
std::move(sourceURL),
|
|
||||||
flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Instance::loadUnbundle(std::unique_ptr<JSModulesUnbundle> unbundle,
|
void Instance::loadUnbundle(std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
std::unique_ptr<const JSBigString> startupScript,
|
std::unique_ptr<const JSBigString> startupScript,
|
||||||
std::string startupScriptSourceURL) {
|
std::string startupScriptSourceURL) {
|
||||||
|
|
|
@ -39,7 +39,6 @@ class Instance {
|
||||||
void loadScriptFromString(std::unique_ptr<const JSBigString> string, std::string sourceURL);
|
void loadScriptFromString(std::unique_ptr<const JSBigString> string, std::string sourceURL);
|
||||||
void loadScriptFromStringSync(std::unique_ptr<const JSBigString> string, std::string sourceURL);
|
void loadScriptFromStringSync(std::unique_ptr<const JSBigString> string, std::string sourceURL);
|
||||||
void loadScriptFromFile(const std::string& filename, const std::string& sourceURL);
|
void loadScriptFromFile(const std::string& filename, const std::string& sourceURL);
|
||||||
void loadScriptFromOptimizedBundle(std::string bundlePath, std::string sourceURL, int flags);
|
|
||||||
void loadUnbundle(
|
void loadUnbundle(
|
||||||
std::unique_ptr<JSModulesUnbundle> unbundle,
|
std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
std::unique_ptr<const JSBigString> startupScript,
|
std::unique_ptr<const JSBigString> startupScript,
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||||
|
|
||||||
|
#include "JSBigString.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <folly/Memory.h>
|
||||||
|
#include <folly/ScopeGuard.h>
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace react {
|
||||||
|
|
||||||
|
std::unique_ptr<const JSBigFileString> JSBigFileString::fromPath(const std::string& sourceURL) {
|
||||||
|
int fd = ::open(sourceURL.c_str(), O_RDONLY);
|
||||||
|
folly::checkUnixError(fd, "Could not open file", sourceURL);
|
||||||
|
SCOPE_EXIT { CHECK(::close(fd) == 0); };
|
||||||
|
|
||||||
|
struct stat fileInfo;
|
||||||
|
folly::checkUnixError(::fstat(fd, &fileInfo), "fstat on bundle failed.");
|
||||||
|
|
||||||
|
return folly::make_unique<const JSBigFileString>(fd, fileInfo.st_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace react
|
||||||
|
} // namespace facebook
|
|
@ -165,71 +165,4 @@ private:
|
||||||
mutable const char *m_data; // Pointer to the mmaped region.
|
mutable const char *m_data; // Pointer to the mmaped region.
|
||||||
};
|
};
|
||||||
|
|
||||||
class JSBigOptimizedBundleString : public JSBigString {
|
|
||||||
public:
|
|
||||||
enum class Encoding {
|
|
||||||
Unknown,
|
|
||||||
Ascii,
|
|
||||||
Utf8,
|
|
||||||
Utf16,
|
|
||||||
};
|
|
||||||
|
|
||||||
JSBigOptimizedBundleString(int fd, size_t size, const uint8_t sha1[20], Encoding encoding) :
|
|
||||||
m_fd(-1),
|
|
||||||
m_size(size),
|
|
||||||
m_encoding(encoding),
|
|
||||||
m_str(nullptr)
|
|
||||||
{
|
|
||||||
folly::checkUnixError(
|
|
||||||
m_fd = dup(fd),
|
|
||||||
"Could not duplicate file descriptor");
|
|
||||||
|
|
||||||
memcpy(m_hash, sha1, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
~JSBigOptimizedBundleString() {
|
|
||||||
if (m_str) {
|
|
||||||
CHECK(munmap((void *)m_str, m_size) != -1);
|
|
||||||
}
|
|
||||||
close(m_fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isAscii() const override {
|
|
||||||
return m_encoding == Encoding::Ascii;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* c_str() const override {
|
|
||||||
if (!m_str) {
|
|
||||||
m_str = (const char *)mmap(0, m_size, PROT_READ, MAP_SHARED, m_fd, 0);
|
|
||||||
CHECK(m_str != MAP_FAILED);
|
|
||||||
}
|
|
||||||
return m_str;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size() const override {
|
|
||||||
return m_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int fd() const {
|
|
||||||
return m_fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint8_t* hash() const {
|
|
||||||
return m_hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
Encoding encoding() const {
|
|
||||||
return m_encoding;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::unique_ptr<const JSBigOptimizedBundleString> fromOptimizedBundle(const std::string& bundlePath);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_fd;
|
|
||||||
size_t m_size;
|
|
||||||
uint8_t m_hash[20];
|
|
||||||
Encoding m_encoding;
|
|
||||||
mutable const char *m_str;
|
|
||||||
};
|
|
||||||
|
|
||||||
} }
|
} }
|
||||||
|
|
|
@ -343,65 +343,6 @@ static const char* explainLoadSourceStatus(JSLoadSourceStatus status) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WITH_FBJSCEXTENSIONS
|
|
||||||
void JSCExecutor::loadApplicationScript(
|
|
||||||
std::string bundlePath,
|
|
||||||
std::string sourceURL,
|
|
||||||
int flags) {
|
|
||||||
SystraceSection s("JSCExecutor::loadApplicationScript",
|
|
||||||
"sourceURL", sourceURL);
|
|
||||||
|
|
||||||
if (!(flags & (UNPACKED_JS_SOURCE | UNPACKED_BYTECODE))) {
|
|
||||||
throw RecoverableError("Optimized bundle with no unpacked source or bytecode");
|
|
||||||
}
|
|
||||||
|
|
||||||
String jsSourceURL(m_context, sourceURL.c_str());
|
|
||||||
JSSourceCodeRef sourceCode = nullptr;
|
|
||||||
SCOPE_EXIT {
|
|
||||||
if (sourceCode) {
|
|
||||||
JSReleaseSourceCode(sourceCode);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (flags & UNPACKED_BYTECODE) {
|
|
||||||
int fd = open((bundlePath + UNPACKED_BYTECODE_SUFFIX).c_str(), O_RDONLY);
|
|
||||||
RecoverableError::runRethrowingAsRecoverable<std::system_error>([fd]() {
|
|
||||||
folly::checkUnixError(fd, "Couldn't open compiled bundle");
|
|
||||||
});
|
|
||||||
SCOPE_EXIT { close(fd); };
|
|
||||||
|
|
||||||
JSLoadSourceStatus jsStatus;
|
|
||||||
sourceCode = JSCreateCompiledSourceCode(fd, jsSourceURL, &jsStatus);
|
|
||||||
|
|
||||||
if (!sourceCode) {
|
|
||||||
throw RecoverableError(explainLoadSourceStatus(jsStatus));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
auto jsScriptBigString = JSBigOptimizedBundleString::fromOptimizedBundle(bundlePath);
|
|
||||||
if (!jsScriptBigString->isAscii()) {
|
|
||||||
LOG(WARNING) << "Bundle is not ASCII encoded - falling back to the slow path";
|
|
||||||
return loadApplicationScript(std::move(jsScriptBigString), sourceURL);
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceCode = JSCreateSourceCode(
|
|
||||||
jsScriptBigString->fd(),
|
|
||||||
jsSourceURL,
|
|
||||||
jsScriptBigString->hash(),
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReactMarker::logMarker("RUN_JS_BUNDLE_START");
|
|
||||||
|
|
||||||
evaluateSourceCode(m_context, sourceCode, jsSourceURL);
|
|
||||||
|
|
||||||
bindBridge();
|
|
||||||
|
|
||||||
flush();
|
|
||||||
ReactMarker::logMarker("CREATE_REACT_CONTEXT_END");
|
|
||||||
ReactMarker::logMarker("RUN_JS_BUNDLE_END");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void JSCExecutor::loadApplicationScript(std::unique_ptr<const JSBigString> script, std::string sourceURL) {
|
void JSCExecutor::loadApplicationScript(std::unique_ptr<const JSBigString> script, std::string sourceURL) {
|
||||||
SystraceSection s("JSCExecutor::loadApplicationScript",
|
SystraceSection s("JSCExecutor::loadApplicationScript",
|
||||||
"sourceURL", sourceURL);
|
"sourceURL", sourceURL);
|
||||||
|
|
|
@ -62,13 +62,6 @@ public:
|
||||||
std::unique_ptr<const JSBigString> script,
|
std::unique_ptr<const JSBigString> script,
|
||||||
std::string sourceURL) override;
|
std::string sourceURL) override;
|
||||||
|
|
||||||
#ifdef WITH_FBJSCEXTENSIONS
|
|
||||||
virtual void loadApplicationScript(
|
|
||||||
std::string bundlePath,
|
|
||||||
std::string sourceURL,
|
|
||||||
int flags) override;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual void setJSModulesUnbundle(
|
virtual void setJSModulesUnbundle(
|
||||||
std::unique_ptr<JSModulesUnbundle> unbundle) override;
|
std::unique_ptr<JSModulesUnbundle> unbundle) override;
|
||||||
|
|
||||||
|
|
|
@ -111,20 +111,6 @@ NativeToJsBridge::~NativeToJsBridge() {
|
||||||
"NativeToJsBridge::destroy() must be called before deallocating the NativeToJsBridge!";
|
"NativeToJsBridge::destroy() must be called before deallocating the NativeToJsBridge!";
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeToJsBridge::loadOptimizedApplicationScript(
|
|
||||||
std::string bundlePath,
|
|
||||||
std::string sourceURL,
|
|
||||||
int flags) {
|
|
||||||
runOnExecutorQueue(
|
|
||||||
m_mainExecutorToken,
|
|
||||||
[bundlePath=std::move(bundlePath),
|
|
||||||
sourceURL=std::move(sourceURL),
|
|
||||||
flags=flags]
|
|
||||||
(JSExecutor* executor) {
|
|
||||||
executor->loadApplicationScript(std::move(bundlePath), std::move(sourceURL), flags);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void NativeToJsBridge::loadApplication(
|
void NativeToJsBridge::loadApplication(
|
||||||
std::unique_ptr<JSModulesUnbundle> unbundle,
|
std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
std::unique_ptr<const JSBigString> startupScript,
|
std::unique_ptr<const JSBigString> startupScript,
|
||||||
|
|
|
@ -123,12 +123,6 @@ public:
|
||||||
std::unique_ptr<const JSBigString> startupCode,
|
std::unique_ptr<const JSBigString> startupCode,
|
||||||
std::string sourceURL);
|
std::string sourceURL);
|
||||||
|
|
||||||
/**
|
|
||||||
* Similar to loading a "bundle", but instead of passing js source this method accepts
|
|
||||||
* path to a directory containing files prepared for particular JSExecutor.
|
|
||||||
*/
|
|
||||||
void loadOptimizedApplicationScript(std::string bundlePath, std::string sourceURL, int flags);
|
|
||||||
|
|
||||||
void setGlobalVariable(std::string propName, std::unique_ptr<const JSBigString> jsonValue);
|
void setGlobalVariable(std::string propName, std::unique_ptr<const JSBigString> jsonValue);
|
||||||
void* getJavaScriptContext();
|
void* getJavaScriptContext();
|
||||||
bool supportsProfiling();
|
bool supportsProfiling();
|
||||||
|
|
Loading…
Reference in New Issue