From 3e982b9badd60330eaa1d7ab56994e0e302a3ba9 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Fri, 24 Dec 2021 06:53:05 -0800 Subject: [PATCH] child_process: revise argument processing execFile() and fork() have complicated argument processing. Clarify code and avoid using `arguments`. PR-URL: https://github.com/nodejs/node/pull/41280 Reviewed-By: James M Snell Reviewed-By: Antoine du Hamel --- lib/child_process.js | 74 +++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/lib/child_process.js b/lib/child_process.js index 829e5fe5b9ff66..a7ef8ba1e4af1a 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -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: @@ -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 = {