@@ -65,6 +65,7 @@ function parseStringNumbers (parser) {
65
65
*/
66
66
function convertBufferRange ( parser , start , end ) {
67
67
// If returnBuffers is active, all return values are returned as buffers besides numbers and errors
68
+ parser . offset = end + 2
68
69
if ( parser . optionReturnBuffers === true ) {
69
70
return parser . buffer . slice ( start , end )
70
71
}
@@ -82,10 +83,10 @@ function parseSimpleStringViaOffset (parser) {
82
83
var start = parser . offset
83
84
var offset = parser . offset
84
85
var length = parser . buffer . length
86
+ var buffer = parser . buffer
85
87
86
88
while ( offset < length ) {
87
- if ( parser . buffer [ offset ++ ] === 10 ) { // \r\n
88
- parser . offset = offset
89
+ if ( buffer [ offset ++ ] === 10 ) { // \r\n
89
90
return convertBufferRange ( parser , start , offset - 2 )
90
91
}
91
92
}
@@ -140,10 +141,7 @@ function parseBulkString (parser) {
140
141
return
141
142
}
142
143
143
- var offsetBegin = parser . offset
144
- parser . offset = offsetEnd + 2
145
-
146
- return convertBufferRange ( parser , offsetBegin , offsetEnd )
144
+ return convertBufferRange ( parser , parser . offset , offsetEnd )
147
145
}
148
146
149
147
/**
@@ -284,23 +282,22 @@ function JavascriptRedisParser (options) {
284
282
function concatBulkString ( parser ) {
285
283
var list = parser . bufferCache
286
284
// The first chunk might contain the whole bulk string including the \r
287
- var end = parser . totalChunkSize - parser . bigStrSize === - 1
288
285
var chunks = list . length
289
- if ( end ) {
290
- parser . offset = 1
286
+ var offset = parser . bigStrSize - parser . totalChunkSize
287
+ parser . offset = offset
288
+ if ( offset === 1 ) {
291
289
if ( chunks === 2 ) {
292
290
return list [ 0 ] . toString ( 'utf8' , parser . bigOffset , list [ 0 ] . length - 1 )
293
291
}
294
292
} else {
295
- parser . offset = parser . bigStrSize - parser . totalChunkSize
296
293
chunks ++
297
294
}
298
295
var res = list [ 0 ] . toString ( 'utf8' , parser . bigOffset )
299
296
for ( var i = 1 ; i < chunks - 2 ; i ++ ) {
300
297
// We are only safe to fully add up elements that are neither the first nor any of the last two elements
301
298
res += list [ i ] . toString ( )
302
299
}
303
- res += list [ i ] . toString ( 'utf8' , 0 , end ? list [ i ] . length - 1 : parser . offset - 2 )
300
+ res += list [ i ] . toString ( 'utf8' , 0 , offset === 1 ? list [ i ] . length - 1 : offset - 2 )
304
301
return res
305
302
}
306
303
@@ -357,17 +354,15 @@ JavascriptRedisParser.prototype.execute = function (buffer) {
357
354
if ( bufferPool . length < newLength ) { // We can't rely on the chunk size
358
355
bufferPool = new Buffer ( newLength )
359
356
}
360
- var newBuffer = bufferPool
361
- this . buffer . copy ( newBuffer , 0 , this . offset , oldLength )
362
- buffer . copy ( newBuffer , remainingLength , 0 , buffer . length )
363
- this . buffer = newBuffer . slice ( 0 , newLength )
357
+ this . buffer . copy ( bufferPool , 0 , this . offset , oldLength )
358
+ buffer . copy ( bufferPool , remainingLength , 0 , buffer . length )
359
+ this . buffer = bufferPool . slice ( 0 , newLength )
364
360
this . offset = 0
365
361
} else if ( this . totalChunkSize + buffer . length >= this . bigStrSize ) {
366
362
this . bufferCache . push ( buffer )
367
363
// The returned type might be Array * (42) and in that case we can't improve the parsing currently
368
364
if ( this . optionReturnBuffers === false && this . buffer [ this . offset ] === 36 ) {
369
365
this . returnReply ( concatBulkString ( this ) )
370
- this . bigOffset = 0
371
366
this . buffer = buffer
372
367
} else { // This applies for arrays too
373
368
this . buffer = concatBuffer ( this , this . totalChunkSize + buffer . length )
0 commit comments