@@ -157,13 +157,15 @@ exports.execFile = function(file /*, args, options, callback*/) {
157157 } ) ;
158158
159159 var encoding ;
160- var stdoutState ;
161- var stderrState ;
162- var _stdout = [ ] ;
163- var _stderr = [ ] ;
160+ var _stdout ;
161+ var _stderr ;
164162 if ( options . encoding !== 'buffer' && Buffer . isEncoding ( options . encoding ) ) {
165163 encoding = options . encoding ;
164+ _stdout = '' ;
165+ _stderr = '' ;
166166 } else {
167+ _stdout = [ ] ;
168+ _stderr = [ ] ;
167169 encoding = null ;
168170 }
169171 var stdoutLen = 0 ;
@@ -185,23 +187,16 @@ exports.execFile = function(file /*, args, options, callback*/) {
185187
186188 if ( ! callback ) return ;
187189
188- var stdout = Buffer . concat ( _stdout , stdoutLen ) ;
189- var stderr = Buffer . concat ( _stderr , stderrLen ) ;
190-
191- var stdoutEncoding = encoding ;
192- var stderrEncoding = encoding ;
193-
194- if ( stdoutState && stdoutState . decoder )
195- stdoutEncoding = stdoutState . decoder . encoding ;
196-
197- if ( stderrState && stderrState . decoder )
198- stderrEncoding = stderrState . decoder . encoding ;
199-
200- if ( stdoutEncoding )
201- stdout = stdout . toString ( stdoutEncoding ) ;
202-
203- if ( stderrEncoding )
204- stderr = stderr . toString ( stderrEncoding ) ;
190+ // merge chunks
191+ var stdout ;
192+ var stderr ;
193+ if ( ! encoding ) {
194+ stdout = Buffer . concat ( _stdout ) ;
195+ stderr = Buffer . concat ( _stderr ) ;
196+ } else {
197+ stdout = _stdout ;
198+ stderr = _stderr ;
199+ }
205200
206201 if ( ex ) {
207202 // Will be handled later
@@ -261,45 +256,39 @@ exports.execFile = function(file /*, args, options, callback*/) {
261256 }
262257
263258 if ( child . stdout ) {
264- stdoutState = child . stdout . _readableState ;
259+ if ( encoding )
260+ child . stdout . setEncoding ( encoding ) ;
265261
266262 child . stdout . addListener ( 'data' , function ( chunk ) {
267- // If `child.stdout.setEncoding()` happened in userland, convert string to
268- // Buffer.
269- if ( stdoutState . decoder ) {
270- chunk = Buffer . from ( chunk , stdoutState . decoder . encoding ) ;
271- }
272-
273- stdoutLen += chunk . byteLength ;
263+ stdoutLen += chunk . length ;
274264
275265 if ( stdoutLen > options . maxBuffer ) {
276266 ex = new Error ( 'stdout maxBuffer exceeded' ) ;
277- stdoutLen -= chunk . byteLength ;
278267 kill ( ) ;
279268 } else {
280- _stdout . push ( chunk ) ;
269+ if ( ! encoding )
270+ _stdout . push ( chunk ) ;
271+ else
272+ _stdout += chunk ;
281273 }
282274 } ) ;
283275 }
284276
285277 if ( child . stderr ) {
286- stderrState = child . stderr . _readableState ;
278+ if ( encoding )
279+ child . stderr . setEncoding ( encoding ) ;
287280
288281 child . stderr . addListener ( 'data' , function ( chunk ) {
289- // If `child.stderr.setEncoding()` happened in userland, convert string to
290- // Buffer.
291- if ( stderrState . decoder ) {
292- chunk = Buffer . from ( chunk , stderrState . decoder . encoding ) ;
293- }
294-
295- stderrLen += chunk . byteLength ;
282+ stderrLen += chunk . length ;
296283
297284 if ( stderrLen > options . maxBuffer ) {
298285 ex = new Error ( 'stderr maxBuffer exceeded' ) ;
299- stderrLen -= chunk . byteLength ;
300286 kill ( ) ;
301287 } else {
302- _stderr . push ( chunk ) ;
288+ if ( ! encoding )
289+ _stderr . push ( chunk ) ;
290+ else
291+ _stderr += chunk ;
303292 }
304293 } ) ;
305294 }
0 commit comments