Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

child_process: revise argument processing #41280

Merged
merged 1 commit into from Dec 24, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
74 changes: 38 additions & 36 deletions lib/child_process.js
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 };
}
Trott marked this conversation as resolved.
Show resolved Hide 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);
Trott marked this conversation as resolved.
Show resolved Hide 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);
}
Trott marked this conversation as resolved.
Show resolved Hide resolved

options = {
Expand Down