Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
child_process: revise argument processing
execFile() and fork() have complicated argument processing. Clarify code
and avoid using `arguments`.
  • Loading branch information
Trott committed Dec 22, 2021
commit a749686d8260a0f7a58cb396cad6112e804c2583
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 };
}
Comment thread
Trott marked this conversation as resolved.

// 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);
Comment thread
Trott marked this conversation as resolved.
}

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);
}
Comment thread
Trott marked this conversation as resolved.

options = {
Expand Down