summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/child_process.js30
-rw-r--r--test/simple/test-child-process-spawn-typeerror.js11
2 files changed, 31 insertions, 10 deletions
diff --git a/lib/child_process.js b/lib/child_process.js
index 0c1b4c99c..53e0bb24f 100644
--- a/lib/child_process.js
+++ b/lib/child_process.js
@@ -591,7 +591,7 @@ exports.exec = function(command /*, options, callback */) {
exports.execFile = function(file /* args, options, callback */) {
- var args, optionArg, callback;
+ var args = [], optionArg, callback;
var options = {
encoding: 'utf8',
timeout: 0,
@@ -601,18 +601,28 @@ exports.execFile = function(file /* args, options, callback */) {
env: null
};
- // Parse the parameters.
+ // Parse the optional positional parameters.
+ var pos = 1;
+ if (pos < arguments.length && Array.isArray(arguments[pos])) {
+ args = arguments[pos++];
+ }
+ else if(pos < arguments.length && arguments[pos] == null) {
+ pos++;
+ }
- if (typeof arguments[arguments.length - 1] === 'function') {
- callback = arguments[arguments.length - 1];
+ if (pos < arguments.length && typeof arguments[pos] === 'object') {
+ options = util._extend(options, arguments[pos++]);
+ }
+ else if(pos < arguments.length && arguments[pos] == null) {
+ pos++;
}
- if (Array.isArray(arguments[1])) {
- args = arguments[1];
- options = util._extend(options, arguments[2]);
- } else {
- args = [];
- options = util._extend(options, arguments[1]);
+ if (pos < arguments.length && typeof arguments[pos] === 'function') {
+ callback = arguments[pos++];
+ }
+
+ if (pos === 1 && arguments.length > 1) {
+ throw new TypeError('Incorrect value of args option');
}
var child = spawn(file, args, {
diff --git a/test/simple/test-child-process-spawn-typeerror.js b/test/simple/test-child-process-spawn-typeerror.js
index d13d5e62e..b5d1249e5 100644
--- a/test/simple/test-child-process-spawn-typeerror.js
+++ b/test/simple/test-child-process-spawn-typeerror.js
@@ -22,6 +22,7 @@
var assert = require('assert');
var child_process = require('child_process');
var spawn = child_process.spawn;
+var execFile = child_process.execFile;
var cmd = (process.platform === 'win32') ? 'dir' : 'ls';
@@ -34,3 +35,13 @@ assert.throws(function() {
assert.doesNotThrow(function() {
spawn(cmd, {});
});
+
+
+// verify that execFile has same argument parsing behaviour as spawn
+assert.throws(function() {
+ execFile(cmd, 'this is not an array');
+}, TypeError);
+
+assert.doesNotThrow(function() {
+ execFile(cmd, {});
+});