@@ -146,13 +146,15 @@ exports.execFile = function(file /*, args, options, callback*/) {
146146} ) ;
147147
148148var encoding ;
149- var stdoutState ;
150- var stderrState ;
151- var _stdout = [ ] ;
152- var _stderr = [ ] ;
149+ var _stdout ;
150+ var _stderr ;
153151if ( options . encoding !== 'buffer' && Buffer . isEncoding ( options . encoding ) ) {
154152encoding = options . encoding ;
153+ _stdout = '' ;
154+ _stderr = '' ;
155155} else {
156+ _stdout = [ ] ;
157+ _stderr = [ ] ;
156158encoding = null ;
157159}
158160var stdoutLen = 0 ;
@@ -174,23 +176,16 @@ exports.execFile = function(file /*, args, options, callback*/) {
174176
175177if ( ! callback ) return ;
176178
177- var stdout = Buffer . concat ( _stdout , stdoutLen ) ;
178- var stderr = Buffer . concat ( _stderr , stderrLen ) ;
179-
180- var stdoutEncoding = encoding ;
181- var stderrEncoding = encoding ;
182-
183- if ( stdoutState && stdoutState . decoder )
184- stdoutEncoding = stdoutState . decoder . encoding ;
185-
186- if ( stderrState && stderrState . decoder )
187- stderrEncoding = stderrState . decoder . encoding ;
188-
189- if ( stdoutEncoding )
190- stdout = stdout . toString ( stdoutEncoding ) ;
191-
192- if ( stderrEncoding )
193- stderr = stderr . toString ( stderrEncoding ) ;
179+ // merge chunks
180+ var stdout ;
181+ var stderr ;
182+ if ( ! encoding ) {
183+ stdout = Buffer . concat ( _stdout ) ;
184+ stderr = Buffer . concat ( _stderr ) ;
185+ } else {
186+ stdout = _stdout ;
187+ stderr = _stderr ;
188+ }
194189
195190if ( ex ) {
196191// Will be handled later
@@ -250,45 +245,39 @@ exports.execFile = function(file /*, args, options, callback*/) {
250245}
251246
252247if ( child . stdout ) {
253- stdoutState = child . stdout . _readableState ;
248+ if ( encoding )
249+ child . stdout . setEncoding ( encoding ) ;
254250
255251child . stdout . addListener ( 'data' , function ( chunk ) {
256- // If `child.stdout.setEncoding()` happened in userland, convert string to
257- // Buffer.
258- if ( stdoutState . decoder ) {
259- chunk = Buffer . from ( chunk , stdoutState . decoder . encoding ) ;
260- }
261-
262- stdoutLen += chunk . byteLength ;
252+ stdoutLen += chunk . length ;
263253
264254if ( stdoutLen > options . maxBuffer ) {
265255ex = new Error ( 'stdout maxBuffer exceeded' ) ;
266- stdoutLen -= chunk . byteLength ;
267256kill ( ) ;
268257} else {
269- _stdout . push ( chunk ) ;
258+ if ( ! encoding )
259+ _stdout . push ( chunk ) ;
260+ else
261+ _stdout += chunk ;
270262}
271263} ) ;
272264}
273265
274266if ( child . stderr ) {
275- stderrState = child . stderr . _readableState ;
267+ if ( encoding )
268+ child . stderr . setEncoding ( encoding ) ;
276269
277270child . stderr . addListener ( 'data' , function ( chunk ) {
278- // If `child.stderr.setEncoding()` happened in userland, convert string to
279- // Buffer.
280- if ( stderrState . decoder ) {
281- chunk = Buffer . from ( chunk , stderrState . decoder . encoding ) ;
282- }
283-
284- stderrLen += chunk . byteLength ;
271+ stderrLen += chunk . length ;
285272
286273if ( stderrLen > options . maxBuffer ) {
287274ex = new Error ( 'stderr maxBuffer exceeded' ) ;
288- stderrLen -= chunk . byteLength ;
289275kill ( ) ;
290276} else {
291- _stderr . push ( chunk ) ;
277+ if ( ! encoding )
278+ _stderr . push ( chunk ) ;
279+ else
280+ _stderr += chunk ;
292281}
293282} ) ;
294283}
0 commit comments