@@ -234,6 +234,12 @@ def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
234234
235235 #: array of bytes fed.
236236 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
237243 #: Which position we currently reads
238244 self ._buff_i = 0
239245
@@ -388,117 +394,117 @@ def _read_header(self, execute=EX_CONSTRUCT):
388394 elif b == 0xc5 :
389395 typ = TYPE_BIN
390396 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 ]
392398 self ._buff_i += 2
393399 if n > self ._max_bin_len :
394400 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
395401 obj = self ._read (n )
396402 elif b == 0xc6 :
397403 typ = TYPE_BIN
398404 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 ]
400406 self ._buff_i += 4
401407 if n > self ._max_bin_len :
402408 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
403409 obj = self ._read (n )
404410 elif b == 0xc7 : # ext 8
405411 typ = TYPE_EXT
406412 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 )
408414 self ._buff_i += 2
409415 if L > self ._max_ext_len :
410416 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
411417 obj = self ._read (L )
412418 elif b == 0xc8 : # ext 16
413419 typ = TYPE_EXT
414420 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 )
416422 self ._buff_i += 3
417423 if L > self ._max_ext_len :
418424 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
419425 obj = self ._read (L )
420426 elif b == 0xc9 : # ext 32
421427 typ = TYPE_EXT
422428 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 )
424430 self ._buff_i += 5
425431 if L > self ._max_ext_len :
426432 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
427433 obj = self ._read (L )
428434 elif b == 0xca :
429435 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 ]
431437 self ._buff_i += 4
432438 elif b == 0xcb :
433439 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 ]
435441 self ._buff_i += 8
436442 elif b == 0xcc :
437443 self ._reserve (1 )
438444 obj = self ._buffer [self ._buff_i ]
439445 self ._buff_i += 1
440446 elif b == 0xcd :
441447 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 ]
443449 self ._buff_i += 2
444450 elif b == 0xce :
445451 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 ]
447453 self ._buff_i += 4
448454 elif b == 0xcf :
449455 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 ]
451457 self ._buff_i += 8
452458 elif b == 0xd0 :
453459 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 ]
455461 self ._buff_i += 1
456462 elif b == 0xd1 :
457463 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 ]
459465 self ._buff_i += 2
460466 elif b == 0xd2 :
461467 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 ]
463469 self ._buff_i += 4
464470 elif b == 0xd3 :
465471 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 ]
467473 self ._buff_i += 8
468474 elif b == 0xd4 : # fixext 1
469475 typ = TYPE_EXT
470476 if self ._max_ext_len < 1 :
471477 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
472478 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 )
474480 self ._buff_i += 2
475481 elif b == 0xd5 : # fixext 2
476482 typ = TYPE_EXT
477483 if self ._max_ext_len < 2 :
478484 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
479485 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 )
481487 self ._buff_i += 3
482488 elif b == 0xd6 : # fixext 4
483489 typ = TYPE_EXT
484490 if self ._max_ext_len < 4 :
485491 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
486492 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 )
488494 self ._buff_i += 5
489495 elif b == 0xd7 : # fixext 8
490496 typ = TYPE_EXT
491497 if self ._max_ext_len < 8 :
492498 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
493499 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 )
495501 self ._buff_i += 9
496502 elif b == 0xd8 : # fixext 16
497503 typ = TYPE_EXT
498504 if self ._max_ext_len < 16 :
499505 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
500506 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 )
502508 self ._buff_i += 17
503509 elif b == 0xd9 :
504510 typ = TYPE_RAW
@@ -511,43 +517,43 @@ def _read_header(self, execute=EX_CONSTRUCT):
511517 elif b == 0xda :
512518 typ = TYPE_RAW
513519 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 )
515521 self ._buff_i += 2
516522 if n > self ._max_str_len :
517523 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
518524 obj = self ._read (n )
519525 elif b == 0xdb :
520526 typ = TYPE_RAW
521527 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 )
523529 self ._buff_i += 4
524530 if n > self ._max_str_len :
525531 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
526532 obj = self ._read (n )
527533 elif b == 0xdc :
528534 typ = TYPE_ARRAY
529535 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 )
531537 self ._buff_i += 2
532538 if n > self ._max_array_len :
533539 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
534540 elif b == 0xdd :
535541 typ = TYPE_ARRAY
536542 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 )
538544 self ._buff_i += 4
539545 if n > self ._max_array_len :
540546 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
541547 elif b == 0xde :
542548 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 )
544550 self ._buff_i += 2
545551 if n > self ._max_map_len :
546552 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
547553 typ = TYPE_MAP
548554 elif b == 0xdf :
549555 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 )
551557 self ._buff_i += 4
552558 if n > self ._max_map_len :
553559 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
0 commit comments