1313#endif
1414
1515#ifdef __APPLE__
16+
1617#include < CoreFoundation/CFString.h>
1718extern " C" void NSLog (CFStringRef format, ...);
19+
20+ #if defined(__has_include)
21+ #if __has_include(<os/log.h>)
22+ #include < os/log.h>
23+ #define TNS_HAVE_OS_LOG 1
24+ #else
25+ #define TNS_HAVE_OS_LOG 0
26+ #endif
27+ #else
28+ #define TNS_HAVE_OS_LOG 0
29+ #endif
30+
1831#else
1932#include < iostream>
2033#endif
@@ -76,7 +89,7 @@ std::string transformJSObject(napi_env env, napi_value object) {
7689 return JsonStringifyObject (env, object, false );
7790}
7891
79- std::string buildStringFromArg (napi_env env, napi_value val) {
92+ std::string buildStringFromArg (napi_env env, napi_value val, napi_value inspectSymbol ) {
8093 napi_valuetype type;
8194 napi_typeof (env, val, &type);
8295
@@ -105,7 +118,7 @@ std::string buildStringFromArg(napi_env env, napi_value val) {
105118 if (isStrictEqual) {
106119 arrayStr << " [Circular]" ;
107120 } else {
108- std::string elementString = buildStringFromArg (env, propertyValue);
121+ std::string elementString = buildStringFromArg (env, propertyValue, inspectSymbol );
109122 arrayStr << elementString;
110123 }
111124
@@ -117,6 +130,13 @@ std::string buildStringFromArg(napi_env env, napi_value val) {
117130 arrayStr << " ]" ;
118131 return arrayStr.str ();
119132 } else if (type == napi_object) {
133+ napi_value inspectFunc = nullptr ;
134+ napi_status getInspectStatus = napi_get_property (env, val, inspectSymbol, &inspectFunc);
135+ if (getInspectStatus == napi_ok && napi_util::is_of_type (env, inspectFunc, napi_function)) {
136+ napi_value inspectedValue;
137+ napi_call_function (env, val, inspectFunc, 0 , nullptr , &inspectedValue);
138+ return buildStringFromArg (env, inspectedValue, inspectSymbol);
139+ }
120140 return transformJSObject (env, val);
121141 } else if (type == napi_symbol) {
122142 napi_value symString;
@@ -133,6 +153,14 @@ std::string buildLogString(napi_env env, napi_callback_info info,
133153 int startingIndex = 0 ) {
134154 NAPI_CALLBACK_BEGIN_VARGS ()
135155
156+ napi_value global, Symbol, SymbolFor, symbolDescription, inspectSymbol;
157+ napi_get_global (env, &global);
158+ napi_get_named_property (env, global, " Symbol" , &Symbol);
159+ napi_get_named_property (env, Symbol, " for" , &SymbolFor);
160+ napi_create_string_utf8 (env, " nodejs.util.inspect.custom" , NAPI_AUTO_LENGTH,
161+ &symbolDescription);
162+ napi_call_function (env, global, SymbolFor, 1 , &symbolDescription, &inspectSymbol);
163+
136164 std::stringstream ss;
137165
138166 if (argc) {
@@ -142,7 +170,7 @@ std::string buildLogString(napi_env env, napi_callback_info info,
142170 ss << " " ;
143171 }
144172
145- std::string argString = buildStringFromArg (env, argv[i]);
173+ std::string argString = buildStringFromArg (env, argv[i], inspectSymbol );
146174 ss << argString;
147175 }
148176 } else {
@@ -188,14 +216,6 @@ JS_METHOD(Console::Log) {
188216 napi_value argv[argc];
189217 napi_get_cb_info (env, cbinfo, &argc, argv, nullptr , nullptr );
190218
191- napi_value global, Symbol, SymbolFor, symbolDescription, symbol;
192- napi_get_global (env, &global);
193- napi_get_named_property (env, global, " Symbol" , &Symbol);
194- napi_get_named_property (env, Symbol, " for" , &SymbolFor);
195- napi_create_string_utf8 (env, " nodejs.util.inspect.custom" , NAPI_AUTO_LENGTH,
196- &symbolDescription);
197- napi_call_function (env, global, SymbolFor, 1 , &symbolDescription, &symbol);
198-
199219 std::stringstream log;
200220
201221 // TODO(dj): what if we made this pretty?
@@ -227,7 +247,11 @@ JS_METHOD(Console::Log) {
227247 std::string logString = log.str ();
228248
229249#ifdef __APPLE__
250+ #if TNS_HAVE_OS_LOG
251+ os_log (OS_LOG_DEFAULT, " %{public}s" , logString.c_str ());
252+ #else
230253 NSLog (CFSTR(" %s" ), logString.c_str());
254+ #endif
231255#else
232256 switch (stream) {
233257 case kConsoleLogTypeLog :
0 commit comments