@@ -231,6 +231,14 @@ def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
231231 raise TypeError ("`file_like.read` must be callable" )
232232 self .file_like = file_like
233233 self ._feeding = False
234+ # Some old pythons don't support `self.unpack_from()` `bytearray`.
235+ if sys .version_info < (2 , 7 , 6 ):
236+ self ._unpack_from = staticmethod (
237+ lambda f ,b ,o = 0 : struct .unpack_from (f , b [:o + 2 ].tobytes (), o )
238+ )
239+ else :
240+ self ._unpack_from = staticmethod (struct .unpack_from )
241+
234242
235243 #: array of bytes fed.
236244 self ._buffer = bytearray ()
@@ -289,7 +297,7 @@ def feed(self, next_bytes):
289297 self ._buff_i -= self ._buf_checkpoint
290298 self ._buf_checkpoint = 0
291299
292- self ._buffer += view
300+ self ._buffer += bytearray ( view )
293301
294302 def _consume (self ):
295303 """ Gets rid of the used parts of the buffer. """
@@ -388,117 +396,117 @@ def _read_header(self, execute=EX_CONSTRUCT):
388396 elif b == 0xc5 :
389397 typ = TYPE_BIN
390398 self ._reserve (2 )
391- n = struct .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
399+ n = self .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
392400 self ._buff_i += 2
393401 if n > self ._max_bin_len :
394402 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
395403 obj = self ._read (n )
396404 elif b == 0xc6 :
397405 typ = TYPE_BIN
398406 self ._reserve (4 )
399- n = struct .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
407+ n = self .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
400408 self ._buff_i += 4
401409 if n > self ._max_bin_len :
402410 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
403411 obj = self ._read (n )
404412 elif b == 0xc7 : # ext 8
405413 typ = TYPE_EXT
406414 self ._reserve (2 )
407- L , n = struct .unpack_from ('Bb' , self ._buffer , self ._buff_i )
415+ L , n = self .unpack_from ('Bb' , self ._buffer , self ._buff_i )
408416 self ._buff_i += 2
409417 if L > self ._max_ext_len :
410418 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
411419 obj = self ._read (L )
412420 elif b == 0xc8 : # ext 16
413421 typ = TYPE_EXT
414422 self ._reserve (3 )
415- L , n = struct .unpack_from ('>Hb' , self ._buffer , self ._buff_i )
423+ L , n = self .unpack_from ('>Hb' , self ._buffer , self ._buff_i )
416424 self ._buff_i += 3
417425 if L > self ._max_ext_len :
418426 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
419427 obj = self ._read (L )
420428 elif b == 0xc9 : # ext 32
421429 typ = TYPE_EXT
422430 self ._reserve (5 )
423- L , n = struct .unpack_from ('>Ib' , self ._buffer , self ._buff_i )
431+ L , n = self .unpack_from ('>Ib' , self ._buffer , self ._buff_i )
424432 self ._buff_i += 5
425433 if L > self ._max_ext_len :
426434 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
427435 obj = self ._read (L )
428436 elif b == 0xca :
429437 self ._reserve (4 )
430- obj = struct .unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
438+ obj = self .unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
431439 self ._buff_i += 4
432440 elif b == 0xcb :
433441 self ._reserve (8 )
434- obj = struct .unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
442+ obj = self .unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
435443 self ._buff_i += 8
436444 elif b == 0xcc :
437445 self ._reserve (1 )
438446 obj = self ._buffer [self ._buff_i ]
439447 self ._buff_i += 1
440448 elif b == 0xcd :
441449 self ._reserve (2 )
442- obj = struct .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
450+ obj = self .unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
443451 self ._buff_i += 2
444452 elif b == 0xce :
445453 self ._reserve (4 )
446- obj = struct .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
454+ obj = self .unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
447455 self ._buff_i += 4
448456 elif b == 0xcf :
449457 self ._reserve (8 )
450- obj = struct .unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
458+ obj = self .unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
451459 self ._buff_i += 8
452460 elif b == 0xd0 :
453461 self ._reserve (1 )
454- obj = struct .unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
462+ obj = self .unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
455463 self ._buff_i += 1
456464 elif b == 0xd1 :
457465 self ._reserve (2 )
458- obj = struct .unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
466+ obj = self .unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
459467 self ._buff_i += 2
460468 elif b == 0xd2 :
461469 self ._reserve (4 )
462- obj = struct .unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
470+ obj = self .unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
463471 self ._buff_i += 4
464472 elif b == 0xd3 :
465473 self ._reserve (8 )
466- obj = struct .unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
474+ obj = self .unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
467475 self ._buff_i += 8
468476 elif b == 0xd4 : # fixext 1
469477 typ = TYPE_EXT
470478 if self ._max_ext_len < 1 :
471479 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
472480 self ._reserve (2 )
473- n , obj = struct .unpack_from ("b1s" , self ._buffer , self ._buff_i )
481+ n , obj = self .unpack_from ("b1s" , self ._buffer , self ._buff_i )
474482 self ._buff_i += 2
475483 elif b == 0xd5 : # fixext 2
476484 typ = TYPE_EXT
477485 if self ._max_ext_len < 2 :
478486 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
479487 self ._reserve (3 )
480- n , obj = struct .unpack_from ("b2s" , self ._buffer , self ._buff_i )
488+ n , obj = self .unpack_from ("b2s" , self ._buffer , self ._buff_i )
481489 self ._buff_i += 3
482490 elif b == 0xd6 : # fixext 4
483491 typ = TYPE_EXT
484492 if self ._max_ext_len < 4 :
485493 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
486494 self ._reserve (5 )
487- n , obj = struct .unpack_from ("b4s" , self ._buffer , self ._buff_i )
495+ n , obj = self .unpack_from ("b4s" , self ._buffer , self ._buff_i )
488496 self ._buff_i += 5
489497 elif b == 0xd7 : # fixext 8
490498 typ = TYPE_EXT
491499 if self ._max_ext_len < 8 :
492500 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
493501 self ._reserve (9 )
494- n , obj = struct .unpack_from ("b8s" , self ._buffer , self ._buff_i )
502+ n , obj = self .unpack_from ("b8s" , self ._buffer , self ._buff_i )
495503 self ._buff_i += 9
496504 elif b == 0xd8 : # fixext 16
497505 typ = TYPE_EXT
498506 if self ._max_ext_len < 16 :
499507 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
500508 self ._reserve (17 )
501- n , obj = struct .unpack_from ("b16s" , self ._buffer , self ._buff_i )
509+ n , obj = self .unpack_from ("b16s" , self ._buffer , self ._buff_i )
502510 self ._buff_i += 17
503511 elif b == 0xd9 :
504512 typ = TYPE_RAW
@@ -511,43 +519,43 @@ def _read_header(self, execute=EX_CONSTRUCT):
511519 elif b == 0xda :
512520 typ = TYPE_RAW
513521 self ._reserve (2 )
514- n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
522+ n , = self .unpack_from (">H" , self ._buffer , self ._buff_i )
515523 self ._buff_i += 2
516524 if n > self ._max_str_len :
517525 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
518526 obj = self ._read (n )
519527 elif b == 0xdb :
520528 typ = TYPE_RAW
521529 self ._reserve (4 )
522- n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
530+ n , = self .unpack_from (">I" , self ._buffer , self ._buff_i )
523531 self ._buff_i += 4
524532 if n > self ._max_str_len :
525533 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
526534 obj = self ._read (n )
527535 elif b == 0xdc :
528536 typ = TYPE_ARRAY
529537 self ._reserve (2 )
530- n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
538+ n , = self .unpack_from (">H" , self ._buffer , self ._buff_i )
531539 self ._buff_i += 2
532540 if n > self ._max_array_len :
533541 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
534542 elif b == 0xdd :
535543 typ = TYPE_ARRAY
536544 self ._reserve (4 )
537- n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
545+ n , = self .unpack_from (">I" , self ._buffer , self ._buff_i )
538546 self ._buff_i += 4
539547 if n > self ._max_array_len :
540548 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
541549 elif b == 0xde :
542550 self ._reserve (2 )
543- n , = struct .unpack_from (">H" , self ._buffer , self ._buff_i )
551+ n , = self .unpack_from (">H" , self ._buffer , self ._buff_i )
544552 self ._buff_i += 2
545553 if n > self ._max_map_len :
546554 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
547555 typ = TYPE_MAP
548556 elif b == 0xdf :
549557 self ._reserve (4 )
550- n , = struct .unpack_from (">I" , self ._buffer , self ._buff_i )
558+ n , = self .unpack_from (">I" , self ._buffer , self ._buff_i )
551559 self ._buff_i += 4
552560 if n > self ._max_map_len :
553561 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
0 commit comments