@@ -196,7 +196,7 @@ def __init__(self, file_like=None, read_size=0, use_list=True,
196
196
self ._feeding = False
197
197
198
198
#: array of bytes feeded.
199
- self ._buffer = b""
199
+ self ._buffer = bytearray ()
200
200
#: Which position we currently reads
201
201
self ._buff_i = 0
202
202
@@ -249,7 +249,7 @@ def feed(self, next_bytes):
249
249
raise BufferFull
250
250
# bytes + bytearray -> bytearray
251
251
# So cast before append
252
- self ._buffer += bytes ( next_bytes )
252
+ self ._buffer += next_bytes
253
253
254
254
def _consume (self ):
255
255
""" Gets rid of the used parts of the buffer. """
@@ -265,22 +265,26 @@ def read_bytes(self, n):
265
265
return self ._read (n )
266
266
267
267
def _read (self , n ):
268
- # (int, Optional[Callable]) -> bytearray
268
+ # (int) -> bytearray
269
+ self ._reserve (n )
270
+ i = self ._buff_i
271
+ self ._buff_i = i + n
272
+ return self ._buffer [i :i + n ]
273
+
274
+ def _reserve (self , n ):
269
275
remain_bytes = len (self ._buffer ) - self ._buff_i - n
270
276
271
277
# Fast path: buffer has n bytes already
272
278
if remain_bytes >= 0 :
273
- ret = self ._buffer [self ._buff_i :self ._buff_i + n ]
274
- self ._buff_i += n
275
- return ret
279
+ return
276
280
277
281
if self ._feeding :
278
282
self ._buff_i = self ._buf_checkpoint
279
283
raise OutOfData
280
284
281
285
# Strip buffer before checkpoint before reading file.
282
286
if self ._buf_checkpoint > 0 :
283
- self . _buffer = self ._buffer [self ._buf_checkpoint : ]
287
+ del self ._buffer [: self ._buf_checkpoint ]
284
288
self ._buff_i -= self ._buf_checkpoint
285
289
self ._buf_checkpoint = 0
286
290
@@ -299,33 +303,24 @@ def _read(self, n):
299
303
self ._buff_i = 0 # rollback
300
304
raise OutOfData
301
305
302
- if len (self ._buffer ) == n :
303
- # checkpoint == 0
304
- ret = self ._buffer
305
- self ._buffer = b""
306
- self ._buff_i = 0
307
- else :
308
- ret = self ._buffer [self ._buff_i :self ._buff_i + n ]
309
- self ._buff_i += n
310
-
311
- return ret
312
-
313
306
def _read_header (self , execute = EX_CONSTRUCT ):
314
307
typ = TYPE_IMMEDIATE
315
308
n = 0
316
309
obj = None
317
- c = self ._read (1 )
318
- b = ord (c )
319
- if b & 0b10000000 == 0 :
310
+ self ._reserve (1 )
311
+ #b = struct.unpack_from("B", self._buffer, self._buff_i)[0]
312
+ b = self ._buffer [self ._buff_i ]
313
+ self ._buff_i += 1
314
+ if b & 0b10000000 == 0 :
320
315
obj = b
321
316
elif b & 0b11100000 == 0b11100000 :
322
- obj = struct . unpack ( "b" , c )[ 0 ]
317
+ obj = - 1 - ( b ^ 0xff )
323
318
elif b & 0b11100000 == 0b10100000 :
324
319
n = b & 0b00011111
325
- obj = self ._read (n )
326
320
typ = TYPE_RAW
327
321
if n > self ._max_str_len :
328
322
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
323
+ obj = self ._read (n )
329
324
elif b & 0b11110000 == 0b10010000 :
330
325
n = b & 0b00001111
331
326
typ = TYPE_ARRAY
@@ -344,120 +339,179 @@ def _read_header(self, execute=EX_CONSTRUCT):
344
339
obj = True
345
340
elif b == 0xc4 :
346
341
typ = TYPE_BIN
347
- n = struct .unpack ("B" , self ._read (1 ))[0 ]
342
+ self ._reserve (1 )
343
+ #n = struct.unpack_from("B", self._buffer, self._buff_i)[0]
344
+ n = self ._buffer [self ._buff_i ]
345
+ self ._buff_i += 1
348
346
if n > self ._max_bin_len :
349
347
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
350
348
obj = self ._read (n )
351
349
elif b == 0xc5 :
352
350
typ = TYPE_BIN
353
- n = struct .unpack (">H" , self ._read (2 ))[0 ]
351
+ self ._reserve (2 )
352
+ n = struct .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
353
+ self ._buff_i += 2
354
354
if n > self ._max_bin_len :
355
355
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
356
356
obj = self ._read (n )
357
357
elif b == 0xc6 :
358
358
typ = TYPE_BIN
359
- n = struct .unpack (">I" , self ._read (4 ))[0 ]
359
+ self ._reserve (4 )
360
+ n = struct .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
361
+ self ._buff_i += 4
360
362
if n > self ._max_bin_len :
361
363
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
362
364
obj = self ._read (n )
363
365
elif b == 0xc7 : # ext 8
364
366
typ = TYPE_EXT
365
- L , n = struct .unpack ('Bb' , self ._read (2 ))
367
+ self ._reserve (2 )
368
+ L , n = struct .unpack_from ('Bb' , self ._buffer , self ._buff_i )
369
+ self ._buff_i += 2
366
370
if L > self ._max_ext_len :
367
371
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
368
372
obj = self ._read (L )
369
373
elif b == 0xc8 : # ext 16
370
374
typ = TYPE_EXT
371
- L , n = struct .unpack ('>Hb' , self ._read (3 ))
375
+ self ._reserve (3 )
376
+ L , n = struct .unpack_from ('>Hb' , self ._buffer , self ._buff_i )
377
+ self ._buff_i += 3
372
378
if L > self ._max_ext_len :
373
379
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
374
380
obj = self ._read (L )
375
381
elif b == 0xc9 : # ext 32
376
382
typ = TYPE_EXT
377
- L , n = struct .unpack ('>Ib' , self ._read (5 ))
383
+ self ._reserve (5 )
384
+ L , n = struct .unpack_from ('>Ib' , self ._buffer , self ._buff_i )
385
+ self ._buff_i += 5
378
386
if L > self ._max_ext_len :
379
387
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
380
388
obj = self ._read (L )
381
389
elif b == 0xca :
382
- obj = struct .unpack (">f" , self ._read (4 ))[0 ]
390
+ self ._reserve (4 )
391
+ obj = struct .unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
392
+ self ._buff_i += 4
383
393
elif b == 0xcb :
384
- obj = struct .unpack (">d" , self ._read (8 ))[0 ]
394
+ self ._reserve (8 )
395
+ obj = struct .unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
396
+ self ._buff_i += 8
385
397
elif b == 0xcc :
386
- obj = struct .unpack ("B" , self ._read (1 ))[0 ]
398
+ self ._reserve (1 )
399
+ #obj = struct.unpack_from("B", self._buffer, self._buff_i)[0]
400
+ obj = self ._buffer [self ._buff_i ]
401
+ self ._buff_i += 1
387
402
elif b == 0xcd :
388
- obj = struct .unpack (">H" , self ._read (2 ))[0 ]
403
+ self ._reserve (2 )
404
+ obj = struct .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
405
+ self ._buff_i += 2
389
406
elif b == 0xce :
390
- obj = struct .unpack (">I" , self ._read (4 ))[0 ]
407
+ self ._reserve (4 )
408
+ obj = struct .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
409
+ self ._buff_i += 4
391
410
elif b == 0xcf :
392
- obj = struct .unpack (">Q" , self ._read (8 ))[0 ]
411
+ self ._reserve (8 )
412
+ obj = struct .unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
413
+ self ._buff_i += 8
393
414
elif b == 0xd0 :
394
- obj = struct .unpack ("b" , self ._read (1 ))[0 ]
415
+ self ._reserve (1 )
416
+ obj = struct .unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
417
+ self ._buff_i += 1
395
418
elif b == 0xd1 :
396
- obj = struct .unpack (">h" , self ._read (2 ))[0 ]
419
+ self ._reserve (2 )
420
+ obj = struct .unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
421
+ self ._buff_i += 2
397
422
elif b == 0xd2 :
398
- obj = struct .unpack (">i" , self ._read (4 ))[0 ]
423
+ self ._reserve (4 )
424
+ obj = struct .unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
425
+ self ._buff_i += 4
399
426
elif b == 0xd3 :
400
- obj = struct .unpack (">q" , self ._read (8 ))[0 ]
427
+ self ._reserve (8 )
428
+ obj = struct .unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
429
+ self ._buff_i += 8
401
430
elif b == 0xd4 : # fixext 1
402
431
typ = TYPE_EXT
403
432
if self ._max_ext_len < 1 :
404
433
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
405
- n , obj = struct .unpack ('b1s' , self ._read (2 ))
434
+ self ._reserve (2 )
435
+ n , obj = struct .unpack_from ("b1s" , self ._buffer , self ._buff_i )
436
+ self ._buff_i += 2
406
437
elif b == 0xd5 : # fixext 2
407
438
typ = TYPE_EXT
408
439
if self ._max_ext_len < 2 :
409
440
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
410
- n , obj = struct .unpack ('b2s' , self ._read (3 ))
441
+ self ._reserve (3 )
442
+ n , obj = struct .unpack_from ("b2s" , self ._buffer , self ._buff_i )
443
+ self ._buff_i += 3
411
444
elif b == 0xd6 : # fixext 4
412
445
typ = TYPE_EXT
413
446
if self ._max_ext_len < 4 :
414
447
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
415
- n , obj = struct .unpack ('b4s' , self ._read (5 ))
448
+ self ._reserve (5 )
449
+ n , obj = struct .unpack_from ("b4s" , self ._buffer , self ._buff_i )
450
+ self ._buff_i += 5
416
451
elif b == 0xd7 : # fixext 8
417
452
typ = TYPE_EXT
418
453
if self ._max_ext_len < 8 :
419
454
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
420
- n , obj = struct .unpack ('b8s' , self ._read (9 ))
455
+ self ._reserve (9 )
456
+ n , obj = struct .unpack_from ("b8s" , self ._buffer , self ._buff_i )
457
+ self ._buff_i += 9
421
458
elif b == 0xd8 : # fixext 16
422
459
typ = TYPE_EXT
423
460
if self ._max_ext_len < 16 :
424
461
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
425
- n , obj = struct .unpack ('b16s' , self ._read (17 ))
462
+ self ._reserve (17 )
463
+ n , obj = struct .unpack_from ("b16s" , self ._buffer , self ._buff_i )
464
+ self ._buff_i += 17
426
465
elif b == 0xd9 :
427
466
typ = TYPE_RAW
428
- n = struct .unpack ("B" , self ._read (1 ))[0 ]
467
+ self ._reserve (1 )
468
+ #n, = struct.unpack_from("B", self._buffer, self._buff_i)
469
+ n = self ._buffer [self ._buff_i ]
470
+ self ._buff_i += 1
429
471
if n > self ._max_str_len :
430
472
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
431
473
obj = self ._read (n )
432
474
elif b == 0xda :
433
475
typ = TYPE_RAW
434
- n = struct .unpack (">H" , self ._read (2 ))[0 ]
476
+ self ._reserve (2 )
477
+ n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
478
+ self ._buff_i += 2
435
479
if n > self ._max_str_len :
436
480
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
437
481
obj = self ._read (n )
438
482
elif b == 0xdb :
439
483
typ = TYPE_RAW
440
- n = struct .unpack (">I" , self ._read (4 ))[0 ]
484
+ self ._reserve (4 )
485
+ n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
486
+ self ._buff_i += 4
441
487
if n > self ._max_str_len :
442
488
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
443
489
obj = self ._read (n )
444
490
elif b == 0xdc :
445
- n = struct .unpack (">H" , self ._read (2 ))[0 ]
491
+ typ = TYPE_ARRAY
492
+ self ._reserve (2 )
493
+ n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
494
+ self ._buff_i += 2
446
495
if n > self ._max_array_len :
447
496
raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
448
- typ = TYPE_ARRAY
449
497
elif b == 0xdd :
450
- n = struct .unpack (">I" , self ._read (4 ))[0 ]
498
+ typ = TYPE_ARRAY
499
+ self ._reserve (4 )
500
+ n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
501
+ self ._buff_i += 4
451
502
if n > self ._max_array_len :
452
503
raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
453
- typ = TYPE_ARRAY
454
504
elif b == 0xde :
455
- n = struct .unpack (">H" , self ._read (2 ))[0 ]
505
+ self ._reserve (2 )
506
+ n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
507
+ self ._buff_i += 2
456
508
if n > self ._max_map_len :
457
509
raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
458
510
typ = TYPE_MAP
459
511
elif b == 0xdf :
460
- n = struct .unpack (">I" , self ._read (4 ))[0 ]
512
+ self ._reserve (4 )
513
+ n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
514
+ self ._buff_i += 4
461
515
if n > self ._max_map_len :
462
516
raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
463
517
typ = TYPE_MAP
@@ -515,11 +569,13 @@ def _unpack(self, execute=EX_CONSTRUCT):
515
569
if typ == TYPE_RAW :
516
570
if self ._encoding is not None :
517
571
obj = obj .decode (self ._encoding , self ._unicode_errors )
572
+ else :
573
+ obj = bytes (obj )
518
574
return obj
519
575
if typ == TYPE_EXT :
520
- return self ._ext_hook (n , obj )
576
+ return self ._ext_hook (n , bytes ( obj ) )
521
577
if typ == TYPE_BIN :
522
- return obj
578
+ return bytes ( obj )
523
579
assert typ == TYPE_IMMEDIATE
524
580
return obj
525
581
0 commit comments