@@ -234,6 +234,12 @@ def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
234
234
235
235
#: array of bytes fed.
236
236
self ._buffer = bytearray ()
237
+ # Some very old pythons don't support `struct.unpack_from()` with a
238
+ # `bytearray`. So we wrap it in a `buffer()` there.
239
+ if sys .version_info < (2 , 7 , 6 ):
240
+ self ._buffer_view = buffer (self ._buffer )
241
+ else :
242
+ self ._buffer_view = self ._buffer
237
243
#: Which position we currently reads
238
244
self ._buff_i = 0
239
245
@@ -388,117 +394,117 @@ def _read_header(self, execute=EX_CONSTRUCT):
388
394
elif b == 0xc5 :
389
395
typ = TYPE_BIN
390
396
self ._reserve (2 )
391
- n = struct .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
397
+ n = struct .unpack_from (">H" , self ._buffer_view , self ._buff_i )[0 ]
392
398
self ._buff_i += 2
393
399
if n > self ._max_bin_len :
394
400
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
395
401
obj = self ._read (n )
396
402
elif b == 0xc6 :
397
403
typ = TYPE_BIN
398
404
self ._reserve (4 )
399
- n = struct .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
405
+ n = struct .unpack_from (">I" , self ._buffer_view , self ._buff_i )[0 ]
400
406
self ._buff_i += 4
401
407
if n > self ._max_bin_len :
402
408
raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
403
409
obj = self ._read (n )
404
410
elif b == 0xc7 : # ext 8
405
411
typ = TYPE_EXT
406
412
self ._reserve (2 )
407
- L , n = struct .unpack_from ('Bb' , self ._buffer , self ._buff_i )
413
+ L , n = struct .unpack_from ('Bb' , self ._buffer_view , self ._buff_i )
408
414
self ._buff_i += 2
409
415
if L > self ._max_ext_len :
410
416
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
411
417
obj = self ._read (L )
412
418
elif b == 0xc8 : # ext 16
413
419
typ = TYPE_EXT
414
420
self ._reserve (3 )
415
- L , n = struct .unpack_from ('>Hb' , self ._buffer , self ._buff_i )
421
+ L , n = struct .unpack_from ('>Hb' , self ._buffer_view , self ._buff_i )
416
422
self ._buff_i += 3
417
423
if L > self ._max_ext_len :
418
424
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
419
425
obj = self ._read (L )
420
426
elif b == 0xc9 : # ext 32
421
427
typ = TYPE_EXT
422
428
self ._reserve (5 )
423
- L , n = struct .unpack_from ('>Ib' , self ._buffer , self ._buff_i )
429
+ L , n = struct .unpack_from ('>Ib' , self ._buffer_view , self ._buff_i )
424
430
self ._buff_i += 5
425
431
if L > self ._max_ext_len :
426
432
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
427
433
obj = self ._read (L )
428
434
elif b == 0xca :
429
435
self ._reserve (4 )
430
- obj = struct .unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
436
+ obj = struct .unpack_from (">f" , self ._buffer_view , self ._buff_i )[0 ]
431
437
self ._buff_i += 4
432
438
elif b == 0xcb :
433
439
self ._reserve (8 )
434
- obj = struct .unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
440
+ obj = struct .unpack_from (">d" , self ._buffer_view , self ._buff_i )[0 ]
435
441
self ._buff_i += 8
436
442
elif b == 0xcc :
437
443
self ._reserve (1 )
438
444
obj = self ._buffer [self ._buff_i ]
439
445
self ._buff_i += 1
440
446
elif b == 0xcd :
441
447
self ._reserve (2 )
442
- obj = struct .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
448
+ obj = struct .unpack_from (">H" , self ._buffer_view , self ._buff_i )[0 ]
443
449
self ._buff_i += 2
444
450
elif b == 0xce :
445
451
self ._reserve (4 )
446
- obj = struct .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
452
+ obj = struct .unpack_from (">I" , self ._buffer_view , self ._buff_i )[0 ]
447
453
self ._buff_i += 4
448
454
elif b == 0xcf :
449
455
self ._reserve (8 )
450
- obj = struct .unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
456
+ obj = struct .unpack_from (">Q" , self ._buffer_view , self ._buff_i )[0 ]
451
457
self ._buff_i += 8
452
458
elif b == 0xd0 :
453
459
self ._reserve (1 )
454
- obj = struct .unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
460
+ obj = struct .unpack_from ("b" , self ._buffer_view , self ._buff_i )[0 ]
455
461
self ._buff_i += 1
456
462
elif b == 0xd1 :
457
463
self ._reserve (2 )
458
- obj = struct .unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
464
+ obj = struct .unpack_from (">h" , self ._buffer_view , self ._buff_i )[0 ]
459
465
self ._buff_i += 2
460
466
elif b == 0xd2 :
461
467
self ._reserve (4 )
462
- obj = struct .unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
468
+ obj = struct .unpack_from (">i" , self ._buffer_view , self ._buff_i )[0 ]
463
469
self ._buff_i += 4
464
470
elif b == 0xd3 :
465
471
self ._reserve (8 )
466
- obj = struct .unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
472
+ obj = struct .unpack_from (">q" , self ._buffer_view , self ._buff_i )[0 ]
467
473
self ._buff_i += 8
468
474
elif b == 0xd4 : # fixext 1
469
475
typ = TYPE_EXT
470
476
if self ._max_ext_len < 1 :
471
477
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
472
478
self ._reserve (2 )
473
- n , obj = struct .unpack_from ("b1s" , self ._buffer , self ._buff_i )
479
+ n , obj = struct .unpack_from ("b1s" , self ._buffer_view , self ._buff_i )
474
480
self ._buff_i += 2
475
481
elif b == 0xd5 : # fixext 2
476
482
typ = TYPE_EXT
477
483
if self ._max_ext_len < 2 :
478
484
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
479
485
self ._reserve (3 )
480
- n , obj = struct .unpack_from ("b2s" , self ._buffer , self ._buff_i )
486
+ n , obj = struct .unpack_from ("b2s" , self ._buffer_view , self ._buff_i )
481
487
self ._buff_i += 3
482
488
elif b == 0xd6 : # fixext 4
483
489
typ = TYPE_EXT
484
490
if self ._max_ext_len < 4 :
485
491
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
486
492
self ._reserve (5 )
487
- n , obj = struct .unpack_from ("b4s" , self ._buffer , self ._buff_i )
493
+ n , obj = struct .unpack_from ("b4s" , self ._buffer_view , self ._buff_i )
488
494
self ._buff_i += 5
489
495
elif b == 0xd7 : # fixext 8
490
496
typ = TYPE_EXT
491
497
if self ._max_ext_len < 8 :
492
498
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
493
499
self ._reserve (9 )
494
- n , obj = struct .unpack_from ("b8s" , self ._buffer , self ._buff_i )
500
+ n , obj = struct .unpack_from ("b8s" , self ._buffer_view , self ._buff_i )
495
501
self ._buff_i += 9
496
502
elif b == 0xd8 : # fixext 16
497
503
typ = TYPE_EXT
498
504
if self ._max_ext_len < 16 :
499
505
raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
500
506
self ._reserve (17 )
501
- n , obj = struct .unpack_from ("b16s" , self ._buffer , self ._buff_i )
507
+ n , obj = struct .unpack_from ("b16s" , self ._buffer_view , self ._buff_i )
502
508
self ._buff_i += 17
503
509
elif b == 0xd9 :
504
510
typ = TYPE_RAW
@@ -511,43 +517,43 @@ def _read_header(self, execute=EX_CONSTRUCT):
511
517
elif b == 0xda :
512
518
typ = TYPE_RAW
513
519
self ._reserve (2 )
514
- n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
520
+ n , = struct .unpack_from (">H" , self ._buffer_view , self ._buff_i )
515
521
self ._buff_i += 2
516
522
if n > self ._max_str_len :
517
523
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
518
524
obj = self ._read (n )
519
525
elif b == 0xdb :
520
526
typ = TYPE_RAW
521
527
self ._reserve (4 )
522
- n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
528
+ n , = struct .unpack_from (">I" , self ._buffer_view , self ._buff_i )
523
529
self ._buff_i += 4
524
530
if n > self ._max_str_len :
525
531
raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
526
532
obj = self ._read (n )
527
533
elif b == 0xdc :
528
534
typ = TYPE_ARRAY
529
535
self ._reserve (2 )
530
- n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
536
+ n , = struct .unpack_from (">H" , self ._buffer_view , self ._buff_i )
531
537
self ._buff_i += 2
532
538
if n > self ._max_array_len :
533
539
raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
534
540
elif b == 0xdd :
535
541
typ = TYPE_ARRAY
536
542
self ._reserve (4 )
537
- n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
543
+ n , = struct .unpack_from (">I" , self ._buffer_view , self ._buff_i )
538
544
self ._buff_i += 4
539
545
if n > self ._max_array_len :
540
546
raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
541
547
elif b == 0xde :
542
548
self ._reserve (2 )
543
- n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
549
+ n , = struct .unpack_from (">H" , self ._buffer_view , self ._buff_i )
544
550
self ._buff_i += 2
545
551
if n > self ._max_map_len :
546
552
raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
547
553
typ = TYPE_MAP
548
554
elif b == 0xdf :
549
555
self ._reserve (4 )
550
- n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
556
+ n , = struct .unpack_from (">I" , self ._buffer_view , self ._buff_i )
551
557
self ._buff_i += 4
552
558
if n > self ._max_map_len :
553
559
raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
0 commit comments