Skip to content

Commit

Permalink
child_process: revise argument processing
Browse files Browse the repository at this point in the history
execFile() and fork() have complicated argument processing. Clarify code
and avoid using `arguments`.

PR-URL: nodejs#41280
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
  • Loading branch information
Trott authored and Linkgoron committed Jan 31, 2022
1 parent ab2e6bd commit 808973a
Showing 1 changed file with 38 additions and 36 deletions.
74 changes: 38 additions & 36 deletions lib/child_process.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,28 +111,27 @@ const MAX_BUFFER = 1024 * 1024;
* }} [options]
* @returns {ChildProcess}
*/
function fork(modulePath /* , args, options */) {
function fork(modulePath, args = [], options) {
modulePath = getValidatedPath(modulePath, 'modulePath');

// Get options and args arguments.
let execArgv;
let options = {};
let args = [];
let pos = 1;
if (pos < arguments.length && ArrayIsArray(arguments[pos])) {
args = arguments[pos++];
}

if (pos < arguments.length && arguments[pos] == null) {
pos++;
if (args == null) {
args = [];
} else if (typeof args !== 'object') {
throw new ERR_INVALID_ARG_VALUE('args', args);
} else if (!ArrayIsArray(args)) {
options = args;
args = [];
}

if (pos < arguments.length && arguments[pos] != null) {
if (typeof arguments[pos] !== 'object') {
throw new ERR_INVALID_ARG_VALUE(`arguments[${pos}]`, arguments[pos]);
}

options = { ...arguments[pos++] };
if (options == null) {
options = {};
} else if (typeof options !== 'object') {
throw new ERR_INVALID_ARG_VALUE('options', options);
} else {
options = { ...options };
}

// Prepare arguments for fork:
Expand Down Expand Up @@ -276,31 +275,34 @@ ObjectDefineProperty(exec, promisify.custom, {
* ) => any} [callback]
* @returns {ChildProcess}
*/
function execFile(file /* , args, options, callback */) {
let args = [];
let callback;
let options;

// Parse the optional positional parameters.
let pos = 1;
if (pos < arguments.length && ArrayIsArray(arguments[pos])) {
args = arguments[pos++];
} else if (pos < arguments.length && arguments[pos] == null) {
pos++;
}

if (pos < arguments.length && typeof arguments[pos] === 'object') {
options = arguments[pos++];
} else if (pos < arguments.length && arguments[pos] == null) {
pos++;
function execFile(file, args = [], options, callback) {
if (args == null) {
args = [];
} else if (typeof args === 'object') {
if (!ArrayIsArray(args)) {
callback = options;
options = args;
args = [];
}
} else if (typeof args === 'function') {
callback = args;
options = {};
args = [];
} else {
throw new ERR_INVALID_ARG_VALUE('args', args);
}

if (pos < arguments.length && typeof arguments[pos] === 'function') {
callback = arguments[pos++];
if (options == null) {
options = {};
} else if (typeof options === 'function') {
callback = options;
options = {};
} else if (typeof options !== 'object') {
throw new ERR_INVALID_ARG_VALUE('options', options);
}

if (!callback && pos < arguments.length && arguments[pos] != null) {
throw new ERR_INVALID_ARG_VALUE('args', arguments[pos]);
if (callback && typeof callback !== 'function') {
throw new ERR_INVALID_ARG_VALUE('callback', callback);
}

options = {
Expand Down

0 comments on commit 808973a

Please sign in to comment.