1
1
#include " Console.h"
2
2
3
- #include < iostream >
3
+ #include < sstream >
4
4
#include < string>
5
5
6
6
#include " js_native_api.h"
7
+ #include " native_api_util.h"
8
+ #include " runtime/RuntimeConfig.h"
9
+
10
+ #ifdef __APPLE__
11
+ #include < CoreFoundation/CFString.h>
12
+ void NSLog (CFStringRef format, ...);
13
+ #else
14
+ #include < iostream>
15
+ #endif
7
16
8
17
namespace nativescript {
9
18
10
- void Console::Init (napi_env env) {
11
- napi_value global, Console, console;
12
-
13
- napi_get_global (env, &global);
19
+ JS_CLASS_INIT (Console::Init) {
20
+ napi_value Console, console;
14
21
15
22
const napi_property_descriptor properties[] = {
16
- {
17
- .utf8name = " log" ,
18
- .name = nullptr ,
19
- .method = Log,
20
- .getter = nullptr ,
21
- .setter = nullptr ,
22
- .value = nullptr ,
23
- .attributes = napi_default,
24
- .data = (void *)kConsoleStreamLog ,
25
- },
26
- {
27
- .utf8name = " error" ,
28
- .name = nullptr ,
29
- .method = Log,
30
- .getter = nullptr ,
31
- .setter = nullptr ,
32
- .value = nullptr ,
33
- .attributes = napi_default,
34
- .data = (void *)kConsoleStreamError ,
35
- },
36
- {
37
- .utf8name = " warn" ,
38
- .name = nullptr ,
39
- .method = Log,
40
- .getter = nullptr ,
41
- .setter = nullptr ,
42
- .value = nullptr ,
43
- .attributes = napi_default,
44
- .data = (void *)kConsoleStreamWarn ,
45
- },
23
+ napi_util::desc (" log" , Log, (void *)kConsoleLogTypeLog ),
24
+ napi_util::desc (" error" , Log, (void *)kConsoleLogTypeError ),
25
+ napi_util::desc (" warn" , Log, (void *)kConsoleLogTypeWarn ),
26
+ napi_util::desc (" info" , Log, (void *)kConsoleLogTypeInfo ),
27
+ napi_util::desc (" assert" , Log, (void *)kConsoleLogTypeAssert ),
28
+ napi_util::desc (" time" , Time, nullptr ),
29
+ napi_util::desc (" timeEnd" , TimeEnd, nullptr ),
30
+ napi_util::desc (" dir" , Dir, nullptr ),
31
+ napi_util::desc (" trace" , Trace, nullptr ),
46
32
};
47
33
48
34
napi_define_class (env, " Console" , NAPI_AUTO_LENGTH, Console::Constructor,
49
- nullptr , 3 , properties, &Console);
35
+ nullptr , 9 , properties, &Console);
50
36
51
37
napi_new_instance (env, Console, 0 , nullptr , &console);
52
38
53
39
const napi_property_descriptor globalProperties[] = {
54
- {
55
- .utf8name = " console" ,
56
- .name = nullptr ,
57
- .method = nullptr ,
58
- .getter = nullptr ,
59
- .setter = nullptr ,
60
- .value = console,
61
- .attributes = napi_default,
62
- .data = nullptr ,
63
- },
64
- {
65
- .utf8name = " Console" ,
66
- .name = nullptr ,
67
- .method = nullptr ,
68
- .getter = nullptr ,
69
- .setter = nullptr ,
70
- .value = Console,
71
- .attributes = napi_default,
72
- .data = nullptr ,
73
- },
40
+ napi_util::desc (" Console" , Console),
41
+ napi_util::desc (" console" , console),
74
42
};
75
43
76
44
napi_define_properties (env, global, 2 , globalProperties);
77
45
}
78
46
79
- napi_value Console::Constructor (napi_env env, napi_callback_info cbinfo ) {
47
+ JS_METHOD ( Console::Constructor) {
80
48
napi_value thisArg;
81
49
napi_get_cb_info (env, cbinfo, nullptr , nullptr , &thisArg, nullptr );
82
50
return thisArg;
83
51
}
84
52
85
- napi_value Console::Log (napi_env env, napi_callback_info cbinfo) {
53
+ JS_METHOD (Console::Log) {
54
+ if (!RuntimeConfig.LogToSystemConsole ) {
55
+ return UNDEFINED;
56
+ }
57
+
86
58
size_t argc = 0 ;
87
- ConsoleStream stream;
59
+ ConsoleLogType stream;
88
60
void * data = nullptr ;
89
61
90
62
napi_get_cb_info (env, cbinfo, &argc, nullptr , nullptr , &data);
91
63
92
- stream = ConsoleStream ((unsigned long )data);
64
+ stream = ConsoleLogType ((unsigned long )data);
65
+
66
+ size_t initialArg = 0 ;
67
+
68
+ if (stream == kConsoleLogTypeAssert ) {
69
+ bool passes = false ;
70
+
71
+ if (argc > 0 ) {
72
+ napi_value firstArg = nullptr ;
73
+ napi_get_cb_info (env, cbinfo, &argc, &firstArg, nullptr , nullptr );
74
+ napi_coerce_to_bool (env, firstArg, &firstArg);
75
+ napi_get_value_bool (env, firstArg, &passes);
76
+ }
77
+
78
+ if (!passes) {
79
+ initialArg = 1 ;
80
+ } else {
81
+ return UNDEFINED;
82
+ }
83
+ }
93
84
94
85
napi_value argv[argc];
95
86
napi_get_cb_info (env, cbinfo, &argc, argv, nullptr , nullptr );
@@ -102,9 +93,31 @@ napi_value Console::Log(napi_env env, napi_callback_info cbinfo) {
102
93
&symbolDescription);
103
94
napi_call_function (env, global, SymbolFor, 1 , &symbolDescription, &symbol);
104
95
105
- std::string string;
96
+ std::stringstream log;
97
+
98
+ // TODO(dj): what if we made this pretty?
106
99
107
- for (size_t i = 0 ; i < argc; i++) {
100
+ log << " CONSOLE" ;
101
+ switch (stream) {
102
+ case kConsoleLogTypeLog :
103
+ log << " LOG" ;
104
+ break ;
105
+ case kConsoleLogTypeError :
106
+ log << " ERROR" ;
107
+ break ;
108
+ case kConsoleLogTypeWarn :
109
+ log << " WARN" ;
110
+ break ;
111
+ case kConsoleLogTypeInfo :
112
+ log << " INFO" ;
113
+ break ;
114
+ case kConsoleLogTypeAssert :
115
+ log << " ASSERT FAILED" ;
116
+ break ;
117
+ }
118
+ log << " : " ;
119
+
120
+ for (size_t i = initialArg; i < argc; i++) {
108
121
napi_valuetype type;
109
122
napi_typeof (env, argv[i], &type);
110
123
@@ -129,43 +142,55 @@ napi_value Console::Log(napi_env env, napi_callback_info cbinfo) {
129
142
napi_get_value_string_utf8 (env, argstr, strbuf, length + 2 , &length);
130
143
strbuf[length] = i >= (argc - 1 ) ? ' \0 ' : ' ' ;
131
144
strbuf[length + 1 ] = ' \0 ' ;
132
- string += strbuf;
145
+ log << strbuf;
146
+ free (strbuf);
133
147
}
134
148
135
- // TODO(dj): what if we made this pretty?
149
+ log << " \n " ;
136
150
137
- std::string log;
138
- log += " [JS]" ;
139
- switch (stream) {
140
- case kConsoleStreamLog :
141
- // log += "LOG";
142
- break ;
143
- case kConsoleStreamError :
144
- log += " ERROR" ;
145
- break ;
146
- case kConsoleStreamWarn :
147
- log += " WARN" ;
148
- break ;
149
- }
150
- log += " " ;
151
- log += string;
152
- log += " \n " ;
151
+ std::string logString = log.str ();
153
152
153
+ #ifdef __APPLE__
154
+ NSLog (CFSTR(" %s" ), logString.c_str());
155
+ #else
154
156
switch (stream) {
155
- case kConsoleStreamLog :
156
- std::cout << log;
157
- break ;
158
- case kConsoleStreamError :
159
- std::cerr << log;
157
+ case kConsoleLogTypeLog :
158
+ case kConsoleLogTypeInfo :
159
+ std::cout << logString;
160
160
break ;
161
- case kConsoleStreamWarn :
162
- std::cerr << log;
161
+ case kConsoleLogTypeError :
162
+ case kConsoleLogTypeWarn :
163
+ case kConsoleLogTypeAssert :
164
+ std::cerr << logString;
163
165
break ;
164
166
}
167
+ #endif
168
+
169
+ return UNDEFINED;
170
+ }
171
+
172
+ JS_METHOD (Console::Time) {
173
+ napi_value thisArg;
174
+ napi_get_cb_info (env, cbinfo, nullptr , nullptr , &thisArg, nullptr );
175
+ return thisArg;
176
+ }
165
177
166
- napi_value undefined;
167
- napi_get_undefined (env, &undefined);
168
- return undefined;
178
+ JS_METHOD (Console::TimeEnd) {
179
+ napi_value thisArg;
180
+ napi_get_cb_info (env, cbinfo, nullptr , nullptr , &thisArg, nullptr );
181
+ return thisArg;
182
+ }
183
+
184
+ JS_METHOD (Console::Dir) {
185
+ napi_value thisArg;
186
+ napi_get_cb_info (env, cbinfo, nullptr , nullptr , &thisArg, nullptr );
187
+ return thisArg;
188
+ }
189
+
190
+ JS_METHOD (Console::Trace) {
191
+ napi_value thisArg;
192
+ napi_get_cb_info (env, cbinfo, nullptr , nullptr , &thisArg, nullptr );
193
+ return thisArg;
169
194
}
170
195
171
196
} // namespace nativescript
0 commit comments