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: #41280
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Antoine du Hamel <[email protected]>
  • Loading branch information
Trott authored and targos committed Jan 14, 2022
1 parent 1985284 commit ed41fd1
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 ed41fd1

Please sign in to comment.