Cache __fbBatchedBridge reference
Summary: We already do this on Android, and it allows uw to avoid doing this global object lookup for every call. Since there's only a couple of global functions we ever call, we should consider caching all of them in the new bridge. I didn't ValueProtect/ValueUnprotect since these are already globals, and those methods are not exposed on the JSC wrapper. Reviewed By: mhorowitz Differential Revision: D3411487 fbshipit-source-id: 7feaf8803665b77d649e84edad875d31c5acee4b
This commit is contained in:
parent
482b4b6bfa
commit
b90b57c9a1
|
@ -131,8 +131,8 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init)
|
|||
NSThread *_javaScriptThread;
|
||||
CFMutableDictionaryRef _cookieMap;
|
||||
|
||||
JSStringRef _bundleURL;
|
||||
RandomAccessBundleData _randomAccessBundle;
|
||||
JSValueRef _batchedBridgeRef;
|
||||
|
||||
RCTJSCWrapper *_jscWrapper;
|
||||
BOOL _useCustomJSCLibrary;
|
||||
|
@ -576,14 +576,18 @@ static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
|
|||
JSObjectRef globalObjectJSRef = jscWrapper->JSContextGetGlobalObject(strongSelf->_context.ctx);
|
||||
|
||||
// get the BatchedBridge object
|
||||
JSStringRef moduleNameJSStringRef = jscWrapper->JSStringCreateWithUTF8CString("__fbBatchedBridge");
|
||||
JSValueRef moduleJSRef = jscWrapper->JSObjectGetProperty(contextJSRef, globalObjectJSRef, moduleNameJSStringRef, &errorJSRef);
|
||||
jscWrapper->JSStringRelease(moduleNameJSStringRef);
|
||||
JSValueRef batchedBridgeRef = strongSelf->_batchedBridgeRef;
|
||||
if (!batchedBridgeRef) {
|
||||
JSStringRef moduleNameJSStringRef = jscWrapper->JSStringCreateWithUTF8CString("__fbBatchedBridge");
|
||||
batchedBridgeRef = jscWrapper->JSObjectGetProperty(contextJSRef, globalObjectJSRef, moduleNameJSStringRef, &errorJSRef);
|
||||
jscWrapper->JSStringRelease(moduleNameJSStringRef);
|
||||
strongSelf->_batchedBridgeRef = batchedBridgeRef;
|
||||
}
|
||||
|
||||
if (moduleJSRef != NULL && errorJSRef == NULL && !jscWrapper->JSValueIsUndefined(contextJSRef, moduleJSRef)) {
|
||||
if (batchedBridgeRef != NULL && errorJSRef == NULL && !jscWrapper->JSValueIsUndefined(contextJSRef, batchedBridgeRef)) {
|
||||
// get method
|
||||
JSStringRef methodNameJSStringRef = jscWrapper->JSStringCreateWithCFString((__bridge CFStringRef)method);
|
||||
JSValueRef methodJSRef = jscWrapper->JSObjectGetProperty(contextJSRef, (JSObjectRef)moduleJSRef, methodNameJSStringRef, &errorJSRef);
|
||||
JSValueRef methodJSRef = jscWrapper->JSObjectGetProperty(contextJSRef, (JSObjectRef)batchedBridgeRef, methodNameJSStringRef, &errorJSRef);
|
||||
jscWrapper->JSStringRelease(methodNameJSStringRef);
|
||||
|
||||
if (methodJSRef != NULL && errorJSRef == NULL && !jscWrapper->JSValueIsUndefined(contextJSRef, methodJSRef)) {
|
||||
|
@ -591,14 +595,14 @@ static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
|
|||
for (NSUInteger i = 0; i < arguments.count; i++) {
|
||||
jsArgs[i] = [jscWrapper->JSValue valueWithObject:arguments[i] inContext:context].JSValueRef;
|
||||
}
|
||||
resultJSRef = jscWrapper->JSObjectCallAsFunction(contextJSRef, (JSObjectRef)methodJSRef, (JSObjectRef)moduleJSRef, arguments.count, jsArgs, &errorJSRef);
|
||||
resultJSRef = jscWrapper->JSObjectCallAsFunction(contextJSRef, (JSObjectRef)methodJSRef, (JSObjectRef)batchedBridgeRef, arguments.count, jsArgs, &errorJSRef);
|
||||
} else {
|
||||
if (!errorJSRef && jscWrapper->JSValueIsUndefined(contextJSRef, methodJSRef)) {
|
||||
error = RCTErrorWithMessage([NSString stringWithFormat:@"Unable to execute JS call: method %@ is undefined", method]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!errorJSRef && jscWrapper->JSValueIsUndefined(contextJSRef, moduleJSRef)) {
|
||||
if (!errorJSRef && jscWrapper->JSValueIsUndefined(contextJSRef, batchedBridgeRef)) {
|
||||
error = RCTErrorWithMessage(@"Unable to execute JS call: __fbBatchedBridge is undefined");
|
||||
}
|
||||
}
|
||||
|
@ -671,6 +675,7 @@ static void RCTInstallJSCProfiler(RCTBridge *bridge, JSContextRef context)
|
|||
JSStringRef execJSString = jscWrapper->JSStringCreateWithUTF8CString((const char *)script.bytes);
|
||||
JSStringRef bundleURL = jscWrapper->JSStringCreateWithUTF8CString(sourceURL.absoluteString.UTF8String);
|
||||
JSValueRef result = jscWrapper->JSEvaluateScript(strongSelf->_context.ctx, execJSString, NULL, bundleURL, 0, &jsError);
|
||||
jscWrapper->JSStringRelease(bundleURL);
|
||||
jscWrapper->JSStringRelease(execJSString);
|
||||
RCTPerformanceLoggerEnd(RCTPLScriptExecution);
|
||||
|
||||
|
|
Loading…
Reference in New Issue