child_process: Avoid extra copy for string stdio
There's no need to create a new Buffer instance if we're just going to immediately call toString() at the end anyway. Better to create a string up front, and setEncoding() on the streams, and do a string concatenation instead.
This commit is contained in:
parent
711d1934ea
commit
ee695e935d
@ -611,8 +611,18 @@ exports.execFile = function(file /* args, options, callback */) {
|
|||||||
windowsVerbatimArguments: !!options.windowsVerbatimArguments
|
windowsVerbatimArguments: !!options.windowsVerbatimArguments
|
||||||
});
|
});
|
||||||
|
|
||||||
var _stdout = [];
|
var encoding;
|
||||||
var _stderr = [];
|
var _stdout;
|
||||||
|
var _stderr;
|
||||||
|
if (options.encoding !== 'buffer' && Buffer.isEncoding(options.encoding)) {
|
||||||
|
encoding = options.encoding;
|
||||||
|
_stdout = '';
|
||||||
|
_stderr = '';
|
||||||
|
} else {
|
||||||
|
_stdout = [];
|
||||||
|
_stderr = [];
|
||||||
|
encoding = null;
|
||||||
|
}
|
||||||
var stdoutLen = 0;
|
var stdoutLen = 0;
|
||||||
var stderrLen = 0;
|
var stderrLen = 0;
|
||||||
var killed = false;
|
var killed = false;
|
||||||
@ -633,13 +643,14 @@ exports.execFile = function(file /* args, options, callback */) {
|
|||||||
if (!callback) return;
|
if (!callback) return;
|
||||||
|
|
||||||
// merge chunks
|
// merge chunks
|
||||||
var stdout = Buffer.concat(_stdout);
|
var stdout;
|
||||||
var stderr = Buffer.concat(_stderr);
|
var stderr;
|
||||||
|
if (!encoding) {
|
||||||
if (Buffer.isEncoding(options.encoding)) {
|
stdout = Buffer.concat(_stdout);
|
||||||
// convert to strings
|
stderr = Buffer.concat(_stderr);
|
||||||
stdout = stdout.toString(options.encoding);
|
} else {
|
||||||
stderr = stderr.toString(options.encoding);
|
stdout = _stdout;
|
||||||
|
stderr = _stderr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ex) {
|
if (ex) {
|
||||||
@ -683,25 +694,38 @@ exports.execFile = function(file /* args, options, callback */) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
child.stdout.addListener('data', function(chunk) {
|
child.stdout.addListener('data', function(chunk) {
|
||||||
_stdout.push(chunk);
|
|
||||||
stdoutLen += chunk.length;
|
stdoutLen += chunk.length;
|
||||||
|
|
||||||
if (stdoutLen > options.maxBuffer) {
|
if (stdoutLen > options.maxBuffer) {
|
||||||
ex = new Error('stdout maxBuffer exceeded.');
|
ex = new Error('stdout maxBuffer exceeded.');
|
||||||
kill();
|
kill();
|
||||||
|
} else {
|
||||||
|
if (!encoding)
|
||||||
|
_stdout.push(chunk);
|
||||||
|
else
|
||||||
|
_stdout += chunk;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
child.stderr.addListener('data', function(chunk) {
|
child.stderr.addListener('data', function(chunk) {
|
||||||
_stderr.push(chunk);
|
|
||||||
stderrLen += chunk.length;
|
stderrLen += chunk.length;
|
||||||
|
|
||||||
if (stderrLen > options.maxBuffer) {
|
if (stderrLen > options.maxBuffer) {
|
||||||
ex = new Error('stderr maxBuffer exceeded.');
|
ex = new Error('stderr maxBuffer exceeded.');
|
||||||
kill();
|
kill();
|
||||||
|
} else {
|
||||||
|
if (!encoding)
|
||||||
|
_stderr.push(chunk);
|
||||||
|
else
|
||||||
|
_stderr += chunk;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (encoding) {
|
||||||
|
child.stderr.setEncoding(encoding);
|
||||||
|
child.stdout.setEncoding(encoding);
|
||||||
|
}
|
||||||
|
|
||||||
child.addListener('close', exithandler);
|
child.addListener('close', exithandler);
|
||||||
child.addListener('error', errorhandler);
|
child.addListener('error', errorhandler);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user