From c8405d1a3050ed38be1671a3d3da608c956a2c78 Mon Sep 17 00:00:00 2001 From: Nikhilesh Sigatapu Date: Thu, 13 Oct 2016 20:08:47 -0700 Subject: [PATCH] Add a way to access the underlying JavaScriptCore context --- React/Executors/RCTJSCExecutor.h | 5 +++++ React/Executors/RCTJSCExecutor.mm | 5 +++++ .../java/com/facebook/react/bridge/CatalystInstance.java | 5 +++++ .../main/java/com/facebook/react/bridge/ReactContext.java | 7 +++++++ .../com/facebook/react/cxxbridge/CatalystInstanceImpl.java | 3 +++ .../src/main/jni/xreact/jni/CatalystInstanceImpl.cpp | 5 +++++ .../src/main/jni/xreact/jni/CatalystInstanceImpl.h | 1 + ReactCommon/cxxreact/Instance.cpp | 4 ++++ ReactCommon/cxxreact/Instance.h | 1 + 9 files changed, 36 insertions(+) diff --git a/React/Executors/RCTJSCExecutor.h b/React/Executors/RCTJSCExecutor.h index 3a7ae96f307ef7..16483e8eb8d1b0 100644 --- a/React/Executors/RCTJSCExecutor.h +++ b/React/Executors/RCTJSCExecutor.h @@ -108,4 +108,9 @@ RCT_EXTERN NSString *const RCTFBJSValueClassKey; arguments:(NSArray *)args jsValueCallback:(RCTJavaScriptValueCallback)onComplete; +/** + * Get the JavaScriptCore context associated with this executor instance. + */ +- (JSContext *)jsContext; + @end diff --git a/React/Executors/RCTJSCExecutor.mm b/React/Executors/RCTJSCExecutor.mm index 296474b4b9e0cf..34089ae3d2fb6f 100644 --- a/React/Executors/RCTJSCExecutor.mm +++ b/React/Executors/RCTJSCExecutor.mm @@ -927,6 +927,11 @@ static RandomAccessBundleStartupCode readRAMBundle(file_ptr bundle, RandomAccess return [NSData dataWithBytesNoCopy:startupCode.code.release() length:startupCode.size freeWhenDone:YES]; } +- (JSContext *)jsContext +{ + return [self context].context; +} + @end @implementation RCTJSContextProvider diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java index 7690a213e1f28b..a6ab8fd65bdc04 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -75,4 +75,9 @@ void callFunction( @VisibleForTesting void setGlobalVariable(String propName, String jsonValue); + + /** + * Get the C pointer (as a long) to the JavaScriptCore context associated with this instance. + */ + long getJavaScriptContext(); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java index 482c372474351c..674655b998d2b1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java @@ -339,4 +339,11 @@ public boolean startActivityForResult(Intent intent, int code, Bundle bundle) { } return mCurrentActivity.get(); } + + /** + * Get the C pointer (as a long) to the JavaScriptCore context associated with this instance. + */ + public long getJavaScriptContext() { + return mCatalystInstance.getJavaScriptContext(); + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java index bd9d0697b1988c..3fe348bc518116 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/cxxbridge/CatalystInstanceImpl.java @@ -347,6 +347,9 @@ public void removeBridgeIdleDebugListener(NotThreadSafeBridgeIdleDebugListener l @Override public native void setGlobalVariable(String propName, String jsonValue); + @Override + public native long getJavaScriptContext(); + // TODO mhorowitz: add mDestroyed checks to the next three methods @Override diff --git a/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.cpp index cd859b98b7b81c..2a95a01b76e619 100644 --- a/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.cpp @@ -111,6 +111,7 @@ void CatalystInstanceImpl::registerNatives() { makeNativeMethod("callJSCallback", CatalystInstanceImpl::callJSCallback), makeNativeMethod("getMainExecutorToken", CatalystInstanceImpl::getMainExecutorToken), makeNativeMethod("setGlobalVariable", CatalystInstanceImpl::setGlobalVariable), + makeNativeMethod("getJavaScriptContext", CatalystInstanceImpl::getJavaScriptContext), makeNativeMethod("handleMemoryPressureUiHidden", CatalystInstanceImpl::handleMemoryPressureUiHidden), makeNativeMethod("handleMemoryPressureModerate", CatalystInstanceImpl::handleMemoryPressureModerate), makeNativeMethod("handleMemoryPressureCritical", CatalystInstanceImpl::handleMemoryPressureCritical), @@ -219,6 +220,10 @@ void CatalystInstanceImpl::setGlobalVariable(std::string propName, folly::make_unique(std::move(jsonValue))); } +jlong CatalystInstanceImpl::getJavaScriptContext() { + return (jlong) (intptr_t) instance_->getJavaScriptContext(); +} + void CatalystInstanceImpl::handleMemoryPressureUiHidden() { instance_->handleMemoryPressureUiHidden(); } diff --git a/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.h index d0221af9783e04..0de2cec317dda8 100644 --- a/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/xreact/jni/CatalystInstanceImpl.h @@ -55,6 +55,7 @@ class CatalystInstanceImpl : public jni::HybridClass { local_ref getMainExecutorToken(); void setGlobalVariable(std::string propName, std::string&& jsonValue); + jlong getJavaScriptContext(); void handleMemoryPressureUiHidden(); void handleMemoryPressureModerate(); void handleMemoryPressureCritical(); diff --git a/ReactCommon/cxxreact/Instance.cpp b/ReactCommon/cxxreact/Instance.cpp index 34311d1301db0e..04beb12061ee7e 100644 --- a/ReactCommon/cxxreact/Instance.cpp +++ b/ReactCommon/cxxreact/Instance.cpp @@ -132,6 +132,10 @@ void Instance::setGlobalVariable(std::string propName, nativeToJsBridge_->setGlobalVariable(std::move(propName), std::move(jsonValue)); } +void *Instance::getJavaScriptContext() { + return nativeToJsBridge_->getJavaScriptContext(); +} + void Instance::callJSFunction(ExecutorToken token, std::string&& module, std::string&& method, folly::dynamic&& params) { callback_->incrementPendingJSCalls(); diff --git a/ReactCommon/cxxreact/Instance.h b/ReactCommon/cxxreact/Instance.h index 22450e6b687ea2..0a329040631462 100644 --- a/ReactCommon/cxxreact/Instance.h +++ b/ReactCommon/cxxreact/Instance.h @@ -50,6 +50,7 @@ class Instance { void startProfiler(const std::string& title); void stopProfiler(const std::string& title, const std::string& filename); void setGlobalVariable(std::string propName, std::unique_ptr jsonValue); + void *getJavaScriptContext(); void callJSFunction(ExecutorToken token, std::string&& module, std::string&& method, folly::dynamic&& params); void callJSCallback(ExecutorToken token, uint64_t callbackId, folly::dynamic&& params);