@@ -146,13 +146,15 @@ exports.execFile = function(file /*, args, options, callback*/) {
146
146
} ) ;
147
147
148
148
var encoding ;
149
- var stdoutState ;
150
- var stderrState ;
151
- var _stdout = [ ] ;
152
- var _stderr = [ ] ;
149
+ var _stdout ;
150
+ var _stderr ;
153
151
if ( options . encoding !== 'buffer' && Buffer . isEncoding ( options . encoding ) ) {
154
152
encoding = options . encoding ;
153
+ _stdout = '' ;
154
+ _stderr = '' ;
155
155
} else {
156
+ _stdout = [ ] ;
157
+ _stderr = [ ] ;
156
158
encoding = null ;
157
159
}
158
160
var stdoutLen = 0 ;
@@ -174,23 +176,16 @@ exports.execFile = function(file /*, args, options, callback*/) {
174
176
175
177
if ( ! callback ) return ;
176
178
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
+ }
194
189
195
190
if ( ex ) {
196
191
// Will be handled later
@@ -250,45 +245,39 @@ exports.execFile = function(file /*, args, options, callback*/) {
250
245
}
251
246
252
247
if ( child . stdout ) {
253
- stdoutState = child . stdout . _readableState ;
248
+ if ( encoding )
249
+ child . stdout . setEncoding ( encoding ) ;
254
250
255
251
child . 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 ;
263
253
264
254
if ( stdoutLen > options . maxBuffer ) {
265
255
ex = new Error ( 'stdout maxBuffer exceeded' ) ;
266
- stdoutLen -= chunk . byteLength ;
267
256
kill ( ) ;
268
257
} else {
269
- _stdout . push ( chunk ) ;
258
+ if ( ! encoding )
259
+ _stdout . push ( chunk ) ;
260
+ else
261
+ _stdout += chunk ;
270
262
}
271
263
} ) ;
272
264
}
273
265
274
266
if ( child . stderr ) {
275
- stderrState = child . stderr . _readableState ;
267
+ if ( encoding )
268
+ child . stderr . setEncoding ( encoding ) ;
276
269
277
270
child . 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 ;
285
272
286
273
if ( stderrLen > options . maxBuffer ) {
287
274
ex = new Error ( 'stderr maxBuffer exceeded' ) ;
288
- stderrLen -= chunk . byteLength ;
289
275
kill ( ) ;
290
276
} else {
291
- _stderr . push ( chunk ) ;
277
+ if ( ! encoding )
278
+ _stderr . push ( chunk ) ;
279
+ else
280
+ _stderr += chunk ;
292
281
}
293
282
} ) ;
294
283
}
0 commit comments