Skip to content

Commit 056b858

Browse files
committedNov 2, 2017
os: migrate node_os.cc to internal/errors
PR-URL: #16567 Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
1 parent c3dc0e0 commit 056b858

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-12
lines changed
 

‎lib/os.js

+28-6
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,43 @@ const { deprecate } = require('internal/util');
2727
const { getCIDRSuffix } = require('internal/os');
2828
const isWindows = process.platform === 'win32';
2929

30+
const errors = require('internal/errors');
31+
3032
const {
3133
getCPUs,
3234
getFreeMem,
33-
getHomeDirectory,
34-
getHostname,
35-
getInterfaceAddresses,
35+
getHomeDirectory: _getHomeDirectory,
36+
getHostname: _getHostname,
37+
getInterfaceAddresses: _getInterfaceAddresses,
3638
getLoadAvg,
37-
getOSRelease,
38-
getOSType,
39+
getOSRelease: _getOSRelease,
40+
getOSType: _getOSType,
3941
getTotalMem,
40-
getUserInfo,
42+
getUserInfo: _getUserInfo,
4143
getUptime,
4244
isBigEndian
4345
} = process.binding('os');
4446

47+
function getCheckedFunction(fn) {
48+
return function checkError(...args) {
49+
const ctx = {};
50+
const ret = fn(...args, ctx);
51+
if (ret === undefined) {
52+
const err = new errors.SystemError(ctx);
53+
Error.captureStackTrace(err, checkError);
54+
throw err;
55+
}
56+
return ret;
57+
};
58+
}
59+
60+
const getHomeDirectory = getCheckedFunction(_getHomeDirectory);
61+
const getHostname = getCheckedFunction(_getHostname);
62+
const getInterfaceAddresses = getCheckedFunction(_getInterfaceAddresses);
63+
const getOSRelease = getCheckedFunction(_getOSRelease);
64+
const getOSType = getCheckedFunction(_getOSType);
65+
const getUserInfo = getCheckedFunction(_getUserInfo);
66+
4567
getFreeMem[Symbol.toPrimitive] = () => getFreeMem();
4668
getHostname[Symbol.toPrimitive] = () => getHostname();
4769
getHomeDirectory[Symbol.toPrimitive] = () => getHomeDirectory();

‎src/node_os.cc

+20-6
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ static void GetHostname(const FunctionCallbackInfo<Value>& args) {
7272
#else // __MINGW32__
7373
int errorno = WSAGetLastError();
7474
#endif // __POSIX__
75-
return env->ThrowErrnoException(errorno, "gethostname");
75+
CHECK_GE(args.Length(), 1);
76+
env->CollectExceptionInfo(args[args.Length() - 1], errorno, "gethostname");
77+
return args.GetReturnValue().SetUndefined();
7678
}
7779
buf[sizeof(buf) - 1] = '\0';
7880

@@ -87,7 +89,9 @@ static void GetOSType(const FunctionCallbackInfo<Value>& args) {
8789
#ifdef __POSIX__
8890
struct utsname info;
8991
if (uname(&info) < 0) {
90-
return env->ThrowErrnoException(errno, "uname");
92+
CHECK_GE(args.Length(), 1);
93+
env->CollectExceptionInfo(args[args.Length() - 1], errno, "uname");
94+
return args.GetReturnValue().SetUndefined();
9195
}
9296
rval = info.sysname;
9397
#else // __MINGW32__
@@ -105,7 +109,9 @@ static void GetOSRelease(const FunctionCallbackInfo<Value>& args) {
105109
#ifdef __POSIX__
106110
struct utsname info;
107111
if (uname(&info) < 0) {
108-
return env->ThrowErrnoException(errno, "uname");
112+
CHECK_GE(args.Length(), 1);
113+
env->CollectExceptionInfo(args[args.Length() - 1], errno, "uname");
114+
return args.GetReturnValue().SetUndefined();
109115
}
110116
# ifdef _AIX
111117
char release[256];
@@ -242,7 +248,10 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo<Value>& args) {
242248
if (err == UV_ENOSYS) {
243249
return args.GetReturnValue().Set(ret);
244250
} else if (err) {
245-
return env->ThrowUVException(err, "uv_interface_addresses");
251+
CHECK_GE(args.Length(), 1);
252+
env->CollectUVExceptionInfo(args[args.Length() - 1], errno,
253+
"uv_interface_addresses");
254+
return args.GetReturnValue().SetUndefined();
246255
}
247256

248257
for (i = 0; i < count; i++) {
@@ -319,7 +328,9 @@ static void GetHomeDirectory(const FunctionCallbackInfo<Value>& args) {
319328
const int err = uv_os_homedir(buf, &len);
320329

321330
if (err) {
322-
return env->ThrowUVException(err, "uv_os_homedir");
331+
CHECK_GE(args.Length(), 1);
332+
env->CollectUVExceptionInfo(args[args.Length() - 1], err, "uv_os_homedir");
333+
return args.GetReturnValue().SetUndefined();
323334
}
324335

325336
Local<String> home = String::NewFromUtf8(env->isolate(),
@@ -351,7 +362,10 @@ static void GetUserInfo(const FunctionCallbackInfo<Value>& args) {
351362
const int err = uv_os_get_passwd(&pwd);
352363

353364
if (err) {
354-
return env->ThrowUVException(err, "uv_os_get_passwd");
365+
CHECK_GE(args.Length(), 2);
366+
env->CollectUVExceptionInfo(args[args.Length() - 1], err,
367+
"uv_os_get_passwd");
368+
return args.GetReturnValue().SetUndefined();
355369
}
356370

357371
Local<Value> error;

0 commit comments

Comments
 (0)
Please sign in to comment.