@@ -264,16 +264,14 @@ def _get_extradata(self):
264
264
def read_bytes (self , n ):
265
265
return self ._read (n )
266
266
267
- def _read (self , n , write_bytes = None ):
267
+ def _read (self , n ):
268
268
# (int, Optional[Callable]) -> bytearray
269
269
remain_bytes = len (self ._buffer ) - self ._buff_i - n
270
270
271
271
# Fast path: buffer has n bytes already
272
272
if remain_bytes >= 0 :
273
273
ret = self ._buffer [self ._buff_i :self ._buff_i + n ]
274
274
self ._buff_i += n
275
- if write_bytes is not None :
276
- write_bytes (ret )
277
275
return ret
278
276
279
277
if self ._feeding :
@@ -310,23 +308,21 @@ def _read(self, n, write_bytes=None):
310
308
ret = self ._buffer [self ._buff_i :self ._buff_i + n ]
311
309
self ._buff_i += n
312
310
313
- if write_bytes is not None :
314
- write_bytes (ret )
315
311
return ret
316
312
317
- def _read_header (self , execute = EX_CONSTRUCT , write_bytes = None ):
313
+ def _read_header (self , execute = EX_CONSTRUCT ):
318
314
typ = TYPE_IMMEDIATE
319
315
n = 0
320
316
obj = None
321
- c = self ._read (1 , write_bytes )
317
+ c = self ._read (1 )
322
318
b = ord (c )
323
319
if b & 0b10000000 == 0 :
324
320
obj = b
325
321
elif b & 0b11100000 == 0b11100000 :
326
322
obj = struct .unpack ("b" , c )[0 ]
327
323
elif b & 0b11100000 == 0b10100000 :
328
324
n = b & 0b00011111
329
- obj = self ._read (n , write_bytes )
325
+ obj = self ._read (n )
330
326
typ = TYPE_RAW
331
327
if n > self ._max_str_len :
332
328
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
@@ -348,129 +344,129 @@ def _read_header(self, execute=EX_CONSTRUCT, write_bytes=None):
348
344
obj = True
349
345
elif b == 0xc4 :
350
346
typ = TYPE_BIN
351
- n = struct .unpack ("B" , self ._read (1 , write_bytes ))[0 ]
347
+ n = struct .unpack ("B" , self ._read (1 ))[0 ]
352
348
if n > self ._max_bin_len :
353
349
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
354
- obj = self ._read (n , write_bytes )
350
+ obj = self ._read (n )
355
351
elif b == 0xc5 :
356
352
typ = TYPE_BIN
357
- n = struct .unpack (">H" , self ._read (2 , write_bytes ))[0 ]
353
+ n = struct .unpack (">H" , self ._read (2 ))[0 ]
358
354
if n > self ._max_bin_len :
359
355
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
360
- obj = self ._read (n , write_bytes )
356
+ obj = self ._read (n )
361
357
elif b == 0xc6 :
362
358
typ = TYPE_BIN
363
- n = struct .unpack (">I" , self ._read (4 , write_bytes ))[0 ]
359
+ n = struct .unpack (">I" , self ._read (4 ))[0 ]
364
360
if n > self ._max_bin_len :
365
361
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
366
- obj = self ._read (n , write_bytes )
362
+ obj = self ._read (n )
367
363
elif b == 0xc7 : # ext 8
368
364
typ = TYPE_EXT
369
- L , n = struct .unpack ('Bb' , self ._read (2 , write_bytes ))
365
+ L , n = struct .unpack ('Bb' , self ._read (2 ))
370
366
if L > self ._max_ext_len :
371
367
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
372
- obj = self ._read (L , write_bytes )
368
+ obj = self ._read (L )
373
369
elif b == 0xc8 : # ext 16
374
370
typ = TYPE_EXT
375
- L , n = struct .unpack ('>Hb' , self ._read (3 , write_bytes ))
371
+ L , n = struct .unpack ('>Hb' , self ._read (3 ))
376
372
if L > self ._max_ext_len :
377
373
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
378
- obj = self ._read (L , write_bytes )
374
+ obj = self ._read (L )
379
375
elif b == 0xc9 : # ext 32
380
376
typ = TYPE_EXT
381
- L , n = struct .unpack ('>Ib' , self ._read (5 , write_bytes ))
377
+ L , n = struct .unpack ('>Ib' , self ._read (5 ))
382
378
if L > self ._max_ext_len :
383
379
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
384
- obj = self ._read (L , write_bytes )
380
+ obj = self ._read (L )
385
381
elif b == 0xca :
386
- obj = struct .unpack (">f" , self ._read (4 , write_bytes ))[0 ]
382
+ obj = struct .unpack (">f" , self ._read (4 ))[0 ]
387
383
elif b == 0xcb :
388
- obj = struct .unpack (">d" , self ._read (8 , write_bytes ))[0 ]
384
+ obj = struct .unpack (">d" , self ._read (8 ))[0 ]
389
385
elif b == 0xcc :
390
- obj = struct .unpack ("B" , self ._read (1 , write_bytes ))[0 ]
386
+ obj = struct .unpack ("B" , self ._read (1 ))[0 ]
391
387
elif b == 0xcd :
392
- obj = struct .unpack (">H" , self ._read (2 , write_bytes ))[0 ]
388
+ obj = struct .unpack (">H" , self ._read (2 ))[0 ]
393
389
elif b == 0xce :
394
- obj = struct .unpack (">I" , self ._read (4 , write_bytes ))[0 ]
390
+ obj = struct .unpack (">I" , self ._read (4 ))[0 ]
395
391
elif b == 0xcf :
396
- obj = struct .unpack (">Q" , self ._read (8 , write_bytes ))[0 ]
392
+ obj = struct .unpack (">Q" , self ._read (8 ))[0 ]
397
393
elif b == 0xd0 :
398
- obj = struct .unpack ("b" , self ._read (1 , write_bytes ))[0 ]
394
+ obj = struct .unpack ("b" , self ._read (1 ))[0 ]
399
395
elif b == 0xd1 :
400
- obj = struct .unpack (">h" , self ._read (2 , write_bytes ))[0 ]
396
+ obj = struct .unpack (">h" , self ._read (2 ))[0 ]
401
397
elif b == 0xd2 :
402
- obj = struct .unpack (">i" , self ._read (4 , write_bytes ))[0 ]
398
+ obj = struct .unpack (">i" , self ._read (4 ))[0 ]
403
399
elif b == 0xd3 :
404
- obj = struct .unpack (">q" , self ._read (8 , write_bytes ))[0 ]
400
+ obj = struct .unpack (">q" , self ._read (8 ))[0 ]
405
401
elif b == 0xd4 : # fixext 1
406
402
typ = TYPE_EXT
407
403
if self ._max_ext_len < 1 :
408
404
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
409
- n , obj = struct .unpack ('b1s' , self ._read (2 , write_bytes ))
405
+ n , obj = struct .unpack ('b1s' , self ._read (2 ))
410
406
elif b == 0xd5 : # fixext 2
411
407
typ = TYPE_EXT
412
408
if self ._max_ext_len < 2 :
413
409
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
414
- n , obj = struct .unpack ('b2s' , self ._read (3 , write_bytes ))
410
+ n , obj = struct .unpack ('b2s' , self ._read (3 ))
415
411
elif b == 0xd6 : # fixext 4
416
412
typ = TYPE_EXT
417
413
if self ._max_ext_len < 4 :
418
414
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
419
- n , obj = struct .unpack ('b4s' , self ._read (5 , write_bytes ))
415
+ n , obj = struct .unpack ('b4s' , self ._read (5 ))
420
416
elif b == 0xd7 : # fixext 8
421
417
typ = TYPE_EXT
422
418
if self ._max_ext_len < 8 :
423
419
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
424
- n , obj = struct .unpack ('b8s' , self ._read (9 , write_bytes ))
420
+ n , obj = struct .unpack ('b8s' , self ._read (9 ))
425
421
elif b == 0xd8 : # fixext 16
426
422
typ = TYPE_EXT
427
423
if self ._max_ext_len < 16 :
428
424
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
429
- n , obj = struct .unpack ('b16s' , self ._read (17 , write_bytes ))
425
+ n , obj = struct .unpack ('b16s' , self ._read (17 ))
430
426
elif b == 0xd9 :
431
427
typ = TYPE_RAW
432
- n = struct .unpack ("B" , self ._read (1 , write_bytes ))[0 ]
428
+ n = struct .unpack ("B" , self ._read (1 ))[0 ]
433
429
if n > self ._max_str_len :
434
430
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
435
- obj = self ._read (n , write_bytes )
431
+ obj = self ._read (n )
436
432
elif b == 0xda :
437
433
typ = TYPE_RAW
438
- n = struct .unpack (">H" , self ._read (2 , write_bytes ))[0 ]
434
+ n = struct .unpack (">H" , self ._read (2 ))[0 ]
439
435
if n > self ._max_str_len :
440
436
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
441
- obj = self ._read (n , write_bytes )
437
+ obj = self ._read (n )
442
438
elif b == 0xdb :
443
439
typ = TYPE_RAW
444
- n = struct .unpack (">I" , self ._read (4 , write_bytes ))[0 ]
440
+ n = struct .unpack (">I" , self ._read (4 ))[0 ]
445
441
if n > self ._max_str_len :
446
442
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
447
- obj = self ._read (n , write_bytes )
443
+ obj = self ._read (n )
448
444
elif b == 0xdc :
449
- n = struct .unpack (">H" , self ._read (2 , write_bytes ))[0 ]
445
+ n = struct .unpack (">H" , self ._read (2 ))[0 ]
450
446
if n > self ._max_array_len :
451
447
raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
452
448
typ = TYPE_ARRAY
453
449
elif b == 0xdd :
454
- n = struct .unpack (">I" , self ._read (4 , write_bytes ))[0 ]
450
+ n = struct .unpack (">I" , self ._read (4 ))[0 ]
455
451
if n > self ._max_array_len :
456
452
raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
457
453
typ = TYPE_ARRAY
458
454
elif b == 0xde :
459
- n = struct .unpack (">H" , self ._read (2 , write_bytes ))[0 ]
455
+ n = struct .unpack (">H" , self ._read (2 ))[0 ]
460
456
if n > self ._max_map_len :
461
457
raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
462
458
typ = TYPE_MAP
463
459
elif b == 0xdf :
464
- n = struct .unpack (">I" , self ._read (4 , write_bytes ))[0 ]
460
+ n = struct .unpack (">I" , self ._read (4 ))[0 ]
465
461
if n > self ._max_map_len :
466
462
raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
467
463
typ = TYPE_MAP
468
464
else :
469
465
raise UnpackValueError ("Unknown header: 0x%x" % b )
470
466
return typ , n , obj
471
467
472
- def _unpack (self , execute = EX_CONSTRUCT , write_bytes = None ):
473
- typ , n , obj = self ._read_header (execute , write_bytes )
468
+ def _unpack (self , execute = EX_CONSTRUCT ):
469
+ typ , n , obj = self ._read_header (execute )
474
470
475
471
if execute == EX_READ_ARRAY_HEADER :
476
472
if typ != TYPE_ARRAY :
@@ -485,11 +481,11 @@ def _unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
485
481
if execute == EX_SKIP :
486
482
for i in xrange (n ):
487
483
# TODO check whether we need to call `list_hook`
488
- self ._unpack (EX_SKIP , write_bytes )
484
+ self ._unpack (EX_SKIP )
489
485
return
490
486
ret = newlist_hint (n )
491
487
for i in xrange (n ):
492
- ret .append (self ._unpack (EX_CONSTRUCT , write_bytes ))
488
+ ret .append (self ._unpack (EX_CONSTRUCT ))
493
489
if self ._list_hook is not None :
494
490
ret = self ._list_hook (ret )
495
491
# TODO is the interaction between `list_hook` and `use_list` ok?
@@ -498,19 +494,19 @@ def _unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
498
494
if execute == EX_SKIP :
499
495
for i in xrange (n ):
500
496
# TODO check whether we need to call hooks
501
- self ._unpack (EX_SKIP , write_bytes )
502
- self ._unpack (EX_SKIP , write_bytes )
497
+ self ._unpack (EX_SKIP )
498
+ self ._unpack (EX_SKIP )
503
499
return
504
500
if self ._object_pairs_hook is not None :
505
501
ret = self ._object_pairs_hook (
506
- (self ._unpack (EX_CONSTRUCT , write_bytes ),
507
- self ._unpack (EX_CONSTRUCT , write_bytes ))
502
+ (self ._unpack (EX_CONSTRUCT ),
503
+ self ._unpack (EX_CONSTRUCT ))
508
504
for _ in xrange (n ))
509
505
else :
510
506
ret = {}
511
507
for _ in xrange (n ):
512
- key = self ._unpack (EX_CONSTRUCT , write_bytes )
513
- ret [key ] = self ._unpack (EX_CONSTRUCT , write_bytes )
508
+ key = self ._unpack (EX_CONSTRUCT )
509
+ ret [key ] = self ._unpack (EX_CONSTRUCT )
514
510
if self ._object_hook is not None :
515
511
ret = self ._object_hook (ret )
516
512
return ret
@@ -532,7 +528,7 @@ def __iter__(self):
532
528
533
529
def __next__ (self ):
534
530
try :
535
- ret = self ._unpack (EX_CONSTRUCT , None )
531
+ ret = self ._unpack (EX_CONSTRUCT )
536
532
self ._consume ()
537
533
return ret
538
534
except OutOfData :
@@ -542,21 +538,29 @@ def __next__(self):
542
538
next = __next__
543
539
544
540
def skip (self , write_bytes = None ):
545
- self ._unpack (EX_SKIP , write_bytes )
541
+ self ._unpack (EX_SKIP )
542
+ if write_bytes is not None :
543
+ write_bytes (self ._buffer [self ._buf_checkpoint :self ._buff_i ])
546
544
self ._consume ()
547
545
548
546
def unpack (self , write_bytes = None ):
549
- ret = self ._unpack (EX_CONSTRUCT , write_bytes )
547
+ ret = self ._unpack (EX_CONSTRUCT )
548
+ if write_bytes is not None :
549
+ write_bytes (self ._buffer [self ._buf_checkpoint :self ._buff_i ])
550
550
self ._consume ()
551
551
return ret
552
552
553
553
def read_array_header (self , write_bytes = None ):
554
- ret = self ._unpack (EX_READ_ARRAY_HEADER , write_bytes )
554
+ ret = self ._unpack (EX_READ_ARRAY_HEADER )
555
+ if write_bytes is not None :
556
+ write_bytes (self ._buffer [self ._buf_checkpoint :self ._buff_i ])
555
557
self ._consume ()
556
558
return ret
557
559
558
560
def read_map_header (self , write_bytes = None ):
559
- ret = self ._unpack (EX_READ_MAP_HEADER , write_bytes )
561
+ ret = self ._unpack (EX_READ_MAP_HEADER )
562
+ if write_bytes is not None :
563
+ write_bytes (self ._buffer [self ._buf_checkpoint :self ._buff_i ])
560
564
self ._consume ()
561
565
return ret
562
566
0 commit comments