@@ -287,21 +287,29 @@ static void GetUserInfo(const FunctionCallbackInfo<Value>& args) {
287
287
encoding = UTF8;
288
288
}
289
289
290
- const int err = uv_os_get_passwd (&pwd);
291
-
292
- if (err) {
290
+ if (const int err = uv_os_get_passwd (&pwd)) {
293
291
CHECK_GE (args.Length (), 2 );
294
292
env->CollectUVExceptionInfo (args[args.Length () - 1 ], err,
295
293
" uv_os_get_passwd" );
296
294
return args.GetReturnValue ().SetUndefined ();
297
295
}
298
296
299
- auto free_passwd = OnScopeLeave ([&]() { uv_os_free_passwd (&pwd); });
297
+ auto free_passwd = OnScopeLeave ([&] { uv_os_free_passwd (&pwd); });
300
298
301
299
Local<Value> error;
302
300
301
+ #ifdef _WIN32
302
+ Local<Value> uid = Number::New (
303
+ env->isolate (),
304
+ static_cast <double >(static_cast <int32_t >(pwd.uid & 0xFFFFFFFF )));
305
+ Local<Value> gid = Number::New (
306
+ env->isolate (),
307
+ static_cast <double >(static_cast <int32_t >(pwd.gid & 0xFFFFFFFF )));
308
+ #else
303
309
Local<Value> uid = Number::New (env->isolate (), pwd.uid );
304
310
Local<Value> gid = Number::New (env->isolate (), pwd.gid );
311
+ #endif
312
+
305
313
MaybeLocal<Value> username = StringBytes::Encode (env->isolate (),
306
314
pwd.username ,
307
315
encoding,
@@ -323,21 +331,22 @@ static void GetUserInfo(const FunctionCallbackInfo<Value>& args) {
323
331
return ;
324
332
}
325
333
326
- Local<Object> entry = Object::New (env->isolate ());
327
-
328
- entry->Set (env->context (), env->uid_string (), uid).Check ();
329
- entry->Set (env->context (), env->gid_string (), gid).Check ();
330
- entry->Set (env->context (),
331
- env->username_string (),
332
- username.ToLocalChecked ()).Check ();
333
- entry->Set (env->context (),
334
- env->homedir_string (),
335
- homedir.ToLocalChecked ()).Check ();
336
- entry->Set (env->context (),
337
- env->shell_string (),
338
- shell.ToLocalChecked ()).Check ();
339
-
340
- args.GetReturnValue ().Set (entry);
334
+ constexpr size_t kRetLength = 5 ;
335
+ std::array<Local<v8::Name>, kRetLength > names = {env->uid_string (),
336
+ env->gid_string (),
337
+ env->username_string (),
338
+ env->homedir_string (),
339
+ env->shell_string ()};
340
+ std::array values = {uid,
341
+ gid,
342
+ username.ToLocalChecked (),
343
+ homedir.ToLocalChecked (),
344
+ shell.ToLocalChecked ()};
345
+ args.GetReturnValue ().Set (Object::New (env->isolate (),
346
+ Null (env->isolate ()),
347
+ names.data (),
348
+ values.data (),
349
+ kRetLength ));
341
350
}
342
351
343
352
0 commit comments