37
37
#define NODEREPORT_VERSION " dev"
38
38
#endif
39
39
40
+ #if !defined(UNKNOWN_NODEVERSION_STRING)
41
+ #define UNKNOWN_NODEVERSION_STRING " Unable to determine Node.js version\n "
42
+ #endif
43
+
40
44
#ifndef _WIN32
41
45
extern char ** environ;
42
46
#endif
@@ -72,7 +76,7 @@ const char* v8_states[] = {"JS", "GC", "COMPILER", "OTHER", "EXTERNAL", "IDLE"};
72
76
static bool report_active = false ; // recursion protection
73
77
static char report_filename[NR_MAXNAME + 1 ] = " " ;
74
78
static char report_directory[NR_MAXPATH + 1 ] = " " ; // defaults to current working directory
75
- static std::string version_string = " Unable to determine Node.js version \n " ;
79
+ static std::string version_string = UNKNOWN_NODEVERSION_STRING ;
76
80
#ifdef _WIN32
77
81
static SYSTEMTIME loadtime_tm_struct; // module load time
78
82
#else // UNIX, OSX
@@ -195,6 +199,7 @@ unsigned int ProcessNodeReportVerboseSwitch(const char* args) {
195
199
void SetVersionString (Isolate* isolate) {
196
200
// Catch anything thrown and gracefully return
197
201
Nan::TryCatch trycatch;
202
+ version_string = UNKNOWN_NODEVERSION_STRING;
198
203
199
204
// Retrieve the process object
200
205
v8::Local<v8::String> process_prop;
@@ -209,20 +214,21 @@ void SetVersionString(Isolate* isolate) {
209
214
if (!Nan::New<v8::String>(" version" ).ToLocal (&version_prop)) return ;
210
215
v8::Local<v8::Value> version;
211
216
if (!Nan::Get (process_obj, version_prop).ToLocal (&version)) return ;
212
- if (!version->IsString ()) return ;
213
217
214
- // Format Node.js version for output in report
215
218
// e.g. Node.js version: v6.9.1
216
- Nan::Utf8String node_version (version);
217
- version_string.assign (" Node.js version: " );
218
- version_string.append (*node_version);
219
- version_string.append (" \n " );
219
+ if (version->IsString ()) {
220
+ Nan::Utf8String node_version (version);
221
+ version_string = " Node.js version: " ;
222
+ version_string += *node_version;
223
+ version_string += " \n " ;
224
+ }
220
225
221
226
// Get process.versions
222
227
v8::Local<v8::String> versions_prop;
223
228
if (!Nan::New<v8::String>(" versions" ).ToLocal (&versions_prop)) return ;
224
229
v8::Local<v8::Value> versions_value;
225
230
if (!Nan::Get (process_obj, versions_prop).ToLocal (&versions_value)) return ;
231
+ if (!versions_value->IsObject ()) return ;
226
232
v8::Local<v8::Object> versions_obj = versions_value.As <v8::Object>();
227
233
228
234
// Get component names and versions from process.versions
@@ -239,14 +245,21 @@ void SetVersionString(Isolate* isolate) {
239
245
if (!Nan::Get (versions_obj, name_value).ToLocal (&version_value)) continue ;
240
246
241
247
Nan::Utf8String component_name (name_value);
242
- // Don't duplicate the Node.js version
243
- if (!strcmp (" node" , *component_name)) continue ;
244
-
245
248
Nan::Utf8String component_version (version_value);
246
- std::string component_version_string (*component_name);
247
- component_version_string.append (" : " );
248
- component_version_string.append (*component_version);
249
- comp_versions.push_back (component_version_string);
249
+
250
+ // Don't duplicate the Node.js version
251
+ if (!strcmp (" node" , *component_name)) {
252
+ if (version_string == UNKNOWN_NODEVERSION_STRING) {
253
+ version_string = " Node.js version: v" ;
254
+ version_string += *component_version;
255
+ version_string += " \n " ;
256
+ }
257
+ } else {
258
+ std::string component_version_string (*component_name);
259
+ component_version_string += " : " ;
260
+ component_version_string += *component_version;
261
+ comp_versions.push_back (component_version_string);
262
+ }
250
263
}
251
264
252
265
// Format sorted component versions surrounded by (), wrapped
@@ -255,22 +268,22 @@ void SetVersionString(Isolate* isolate) {
255
268
// openssl: 1.0.2j, uv: 1.9.1, v8: 5.1.281.84, zlib: 1.2.8)
256
269
const size_t wrap = 80 ;
257
270
size_t line_length = 1 ;
258
- version_string. append ( " (" ) ;
271
+ version_string += " (" ;
259
272
std::sort (comp_versions.begin (), comp_versions.end ());
260
273
for (auto it = comp_versions.begin (); it != comp_versions.end (); ++it) {
261
274
size_t length = (*it).length ();
262
275
if (line_length + length + 1 >= wrap) {
263
- version_string. append ( " \n " ) ;
276
+ version_string += " \n " ;
264
277
line_length = 1 ;
265
278
}
266
- version_string. append ( *it) ;
279
+ version_string += *it;
267
280
line_length += length;
268
281
if (it + 1 != comp_versions.end ()) {
269
- version_string. append ( " , " ) ;
282
+ version_string += " , " ;
270
283
line_length += 2 ;
271
284
}
272
285
}
273
- version_string. append ( " )\n " ) ;
286
+ version_string += " )\n " ;
274
287
}
275
288
276
289
/* ******************************************************************************
0 commit comments