[ReactNative] Update JS profiler to be compatible with Android

Summary:
Use nativeTraceBeginSection and nativeTraceEndSection with a more dynamic signature
to be compatible with Android.
This commit is contained in:
Tadeu Zagallo 2015-08-25 01:31:22 -07:00
parent 4382c0e8f4
commit fe0143eb20
3 changed files with 54 additions and 47 deletions

View File

@ -131,8 +131,8 @@ function setUpWebSockets() {
}
function setupProfile() {
console.profile = console.profile || GLOBAL.consoleProfile || function () {};
console.profileEnd = console.profileEnd || GLOBAL.consoleProfileEnd || function () {};
console.profile = console.profile || GLOBAL.nativeTraceBeginSection || function () {};
console.profileEnd = console.profileEnd || GLOBAL.nativeTraceEndSection || function () {};
require('BridgeProfiling').swizzleReactPerf();
}

View File

@ -12,26 +12,20 @@
'use strict';
var GLOBAL = GLOBAL || this;
var TRACE_TAG_REACT_APPS = 1 << 17;
var BridgeProfiling = {
profile(profileName?: any, args?: any) {
profile(profileName?: any) {
if (GLOBAL.__BridgeProfilingIsProfiling) {
if (args) {
try {
args = JSON.stringify(args);
} catch(err) {
args = err.message;
}
}
profileName = typeof profileName === 'function' ?
profileName() : profileName;
console.profile(profileName, args);
console.profile(TRACE_TAG_REACT_APPS, profileName);
}
},
profileEnd() {
if (GLOBAL.__BridgeProfilingIsProfiling) {
console.profileEnd();
console.profileEnd(TRACE_TAG_REACT_APPS);
}
},
@ -39,7 +33,7 @@ var BridgeProfiling = {
var ReactPerf = require('ReactPerf');
var originalMeasure = ReactPerf.measure;
ReactPerf.measure = function (objName, fnName, func) {
func = originalMeasure.call(ReactPerf, objName, fnName, func);
func = originalMeasure.apply(ReactPerf, arguments);
return function (component) {
if (GLOBAL.__BridgeProfilingIsProfiling) {
var name = this._instance && this._instance.constructor &&

View File

@ -136,38 +136,6 @@ static JSValueRef RCTNoop(JSContextRef context, __unused JSObjectRef object, __u
return JSValueMakeUndefined(context);
}
#if RCT_DEV
static JSValueRef RCTConsoleProfile(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], __unused JSValueRef *exception)
{
static int profileCounter = 1;
NSString *profileName;
if (argumentCount > 0) {
profileName = RCTJSValueToNSString(context, arguments[0]);
} else {
profileName = [NSString stringWithFormat:@"Profile %d", profileCounter++];
}
id profileInfo = (id)kCFNull;
if (argumentCount > 1 && !JSValueIsUndefined(context, arguments[1])) {
profileInfo = @[RCTJSValueToNSString(context, arguments[1])];
}
RCTProfileBeginEvent(0, profileName, profileInfo);
return JSValueMakeUndefined(context);
}
static JSValueRef RCTConsoleProfileEnd(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, __unused size_t argumentCount, __unused const JSValueRef arguments[], __unused JSValueRef *exception)
{
RCTProfileEndEvent(0, @"console", nil);
return JSValueMakeUndefined(context);
}
#endif
static NSString *RCTJSValueToNSString(JSContextRef context, JSValueRef value)
{
JSStringRef JSString = JSValueToStringCopy(context, value, NULL);
@ -193,6 +161,51 @@ static NSError *RCTNSErrorFromJSError(JSContextRef context, JSValueRef jsError)
return [NSError errorWithDomain:@"JS" code:1 userInfo:@{NSLocalizedDescriptionKey: errorMessage, NSLocalizedFailureReasonErrorKey: details}];
}
#if RCT_DEV
static JSValueRef RCTNativeTraceBeginSection(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], __unused JSValueRef *exception)
{
static int profileCounter = 1;
NSString *profileName;
double tag = 0;
if (argumentCount > 0) {
if (JSValueIsNumber(context, arguments[0])) {
tag = JSValueToNumber(context, arguments[0], NULL);
} else {
profileName = RCTJSValueToNSString(context, arguments[0]);
}
} else {
profileName = [NSString stringWithFormat:@"Profile %d", profileCounter++];
}
if (argumentCount > 1 && JSValueIsString(context, arguments[1])) {
profileName = RCTJSValueToNSString(context, arguments[1]);
}
if (profileName) {
RCTProfileBeginEvent(tag, profileName, nil);
}
return JSValueMakeUndefined(context);
}
static JSValueRef RCTNativeTraceEndSection(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, __unused size_t argumentCount, __unused const JSValueRef arguments[], __unused JSValueRef *exception)
{
if (argumentCount > 0) {
JSValueRef *error = NULL;
double tag = JSValueToNumber(context, arguments[0], error);
if (error == NULL) {
RCTProfileEndEvent((uint64_t)tag, @"console", nil);
}
}
return JSValueMakeUndefined(context);
}
#endif
+ (void)runRunLoopThread
{
@autoreleasepool {
@ -266,8 +279,8 @@ static NSError *RCTNSErrorFromJSError(JSContextRef context, JSValueRef jsError)
[strongSelf _addNativeHook:RCTNativeLoggingHook withName:"nativeLoggingHook"];
[strongSelf _addNativeHook:RCTNoop withName:"noop"];
#if RCT_DEV
[strongSelf _addNativeHook:RCTConsoleProfile withName:"consoleProfile"];
[strongSelf _addNativeHook:RCTConsoleProfileEnd withName:"consoleProfileEnd"];
[strongSelf _addNativeHook:RCTNativeTraceBeginSection withName:"nativeTraceBeginSection"];
[strongSelf _addNativeHook:RCTNativeTraceEndSection withName:"nativeTraceEndSection"];
#if RCT_JSC_PROFILER
void *JSCProfiler = dlopen(RCT_JSC_PROFILER_DYLIB, RTLD_NOW);