diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTModuleMethodTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTModuleMethodTests.m index a51319bb3..93ac3b5aa 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTModuleMethodTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTModuleMethodTests.m @@ -23,6 +23,7 @@ static BOOL RCTLogsError(void (^block)(void)) { __block BOOL loggedError = NO; RCTPerformBlockWithLogFunction(block, ^(RCTLogLevel level, + __unused RCTLogSource source, __unused NSString *fileName, __unused NSNumber *lineNumber, __unused NSString *message) { diff --git a/Libraries/RCTTest/RCTTestRunner.m b/Libraries/RCTTest/RCTTestRunner.m index 13d38247b..1e5cd448e 100644 --- a/Libraries/RCTTest/RCTTestRunner.m +++ b/Libraries/RCTTest/RCTTestRunner.m @@ -86,7 +86,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) @autoreleasepool { __block NSString *error = nil; - RCTSetLogFunction(^(RCTLogLevel level, NSString *fileName, NSNumber *lineNumber, NSString *message) { + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { if (level >= RCTLogLevelError) { error = message; } diff --git a/React/Base/RCTAssert.m b/React/Base/RCTAssert.m index 5ba9da708..8923f40a5 100644 --- a/React/Base/RCTAssert.m +++ b/React/Base/RCTAssert.m @@ -119,7 +119,7 @@ void _RCTAssertFormat( void RCTFatal(NSError *error) { - _RCTLogInternal(RCTLogLevelFatal, NULL, 0, @"%@", [error localizedDescription]); + _RCTLogNativeInternal(RCTLogLevelFatal, NULL, 0, @"%@", [error localizedDescription]); RCTFatalHandler fatalHandler = RCTGetFatalHandler(); if (fatalHandler) { diff --git a/React/Base/RCTLog.h b/React/Base/RCTLog.h index 28a615af8..27cdf3158 100644 --- a/React/Base/RCTLog.h +++ b/React/Base/RCTLog.h @@ -45,6 +45,14 @@ typedef NS_ENUM(NSInteger, RCTLogLevel) { RCTLogLevelFatal = 4 }; +/** + * An enum representing the source of a log message. + */ +typedef NS_ENUM(NSInteger, RCTLogSource) { + RCTLogSourceNative = 1, + RCTLogSourceJavaScript = 2 +}; + /** * A block signature to be used for custom logging functions. In most cases you * will want to pass these arguments to the RCTFormatLog function in order to @@ -52,6 +60,7 @@ typedef NS_ENUM(NSInteger, RCTLogLevel) { */ typedef void (^RCTLogFunction)( RCTLogLevel level, + RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message @@ -115,9 +124,10 @@ RCT_EXTERN void RCTPerformBlockWithLogPrefix(void (^block)(void), NSString *pref * Private logging function - ignore this. */ #if RCTLOG_ENABLED -#define _RCTLog(lvl, ...) _RCTLogInternal(lvl, __FILE__, __LINE__, __VA_ARGS__); +#define _RCTLog(lvl, ...) _RCTLogNativeInternal(lvl, __FILE__, __LINE__, __VA_ARGS__); #else #define _RCTLog(lvl, ...) do { } while (0) #endif -RCT_EXTERN void _RCTLogInternal(RCTLogLevel, const char *, int, NSString *, ...) NS_FORMAT_FUNCTION(4,5); +RCT_EXTERN void _RCTLogNativeInternal(RCTLogLevel, const char *, int, NSString *, ...) NS_FORMAT_FUNCTION(4,5); +RCT_EXTERN void _RCTLogJavaScriptInternal(RCTLogLevel, NSString *); diff --git a/React/Base/RCTLog.m b/React/Base/RCTLog.m index b9360f449..02bc9b660 100644 --- a/React/Base/RCTLog.m +++ b/React/Base/RCTLog.m @@ -53,14 +53,13 @@ void RCTSetLogThreshold(RCTLogLevel threshold) { RCTLogFunction RCTDefaultLogFunction = ^( RCTLogLevel level, + RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message ) { - NSString *log = RCTFormatLog( - [NSDate date], level, fileName, lineNumber, message - ); + NSString *log = RCTFormatLog([NSDate date], level, fileName, lineNumber, message); fprintf(stderr, "%s\n", log.UTF8String); fflush(stderr); @@ -102,13 +101,9 @@ void RCTAddLogFunction(RCTLogFunction logFunction) { RCTLogFunction existing = RCTGetLogFunction(); if (existing) { - RCTSetLogFunction(^(RCTLogLevel level, - NSString *fileName, - NSNumber *lineNumber, - NSString *message) { - - existing(level, fileName, lineNumber, message); - logFunction(level, fileName, lineNumber, message); + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + existing(level, source, fileName, lineNumber, message); + logFunction(level, source, fileName, lineNumber, message); }); } else { RCTSetLogFunction(logFunction); @@ -147,8 +142,10 @@ void RCTPerformBlockWithLogPrefix(void (^block)(void), NSString *prefix) { RCTLogFunction logFunction = RCTGetLocalLogFunction(); if (logFunction) { - RCTPerformBlockWithLogFunction(block, ^(RCTLogLevel level, NSString *fileName, NSNumber *lineNumber, NSString *message) { - logFunction(level, fileName, lineNumber, [prefix stringByAppendingString:message]); + RCTPerformBlockWithLogFunction(block, ^(RCTLogLevel level, RCTLogSource source, + NSString *fileName, NSNumber *lineNumber, + NSString *message) { + logFunction(level, source, fileName, lineNumber, [prefix stringByAppendingString:message]); }); } } @@ -192,17 +189,11 @@ NSString *RCTFormatLog( return log; } -void _RCTLogInternal( - RCTLogLevel level, - const char *fileName, - int lineNumber, - NSString *format, ... -) +void _RCTLogNativeInternal(RCTLogLevel level, const char *fileName, int lineNumber, NSString *format, ...) { RCTLogFunction logFunction = RCTGetLocalLogFunction(); BOOL log = RCT_DEBUG || (logFunction != nil); if (log && level >= RCTGetLogThreshold()) { - // Get message va_list args; va_start(args, format); @@ -211,7 +202,7 @@ void _RCTLogInternal( // Call log function if (logFunction) { - logFunction(level, fileName ? @(fileName) : nil, (lineNumber >= 0) ? @(lineNumber) : nil, message); + logFunction(level, RCTLogSourceNative, fileName ? @(fileName) : nil, lineNumber > 0 ? @(lineNumber) : nil, message); } #if RCT_DEBUG @@ -245,3 +236,14 @@ void _RCTLogInternal( #endif } } + +void _RCTLogJavaScriptInternal(RCTLogLevel level, NSString *message) +{ + RCTLogFunction logFunction = RCTGetLocalLogFunction(); + BOOL log = RCT_DEBUG || (logFunction != nil); + if (log && level >= RCTGetLogThreshold()) { + if (logFunction) { + logFunction(level, RCTLogSourceJavaScript, nil, nil, message); + } + } +} diff --git a/React/Executors/RCTContextExecutor.m b/React/Executors/RCTContextExecutor.m index 59c702025..ee7678298 100644 --- a/React/Executors/RCTContextExecutor.m +++ b/React/Executors/RCTContextExecutor.m @@ -126,7 +126,7 @@ static JSValueRef RCTNativeLoggingHook(JSContextRef context, __unused JSObjectRe level = MAX(level, JSValueToNumber(context, arguments[1], exception)); } - _RCTLog(level, @"%@", message); + _RCTLogJavaScriptInternal(level, message); } return JSValueMakeUndefined(context);