@@ -126,6 +126,13 @@ def unpackb(packed, **kwargs):
126126 return ret
127127
128128
129+ if sys .version < (2 , 7 , 6 ):
130+ def _unpack_from (f , b , o = 0 ):
131+ return struct .unpack_from (f , b [:o + 2 ].tobytes (), o )
132+ else :
133+ _unpack_from = struct .unpack_from
134+
135+
129136class Unpacker (object ):
130137 """Streaming unpacker.
131138
@@ -205,11 +212,6 @@ class Unpacker(object):
205212 for o in unpacker:
206213 process(o)
207214 """
208- # Some old pythons don't support `self._unpack_from()` `bytearray`.
209- _unpack_from = staticmethod (
210- struct .unpack_from if sys .version_info >= (2 , 7 , 6 )
211- else lambda f ,b ,o = 0 : struct .unpack_from (f , b [:o + 2 ].tobytes (),o )
212- )
213215
214216 def __init__ (self , file_like = None , read_size = 0 , use_list = True , raw = True ,
215217 object_hook = None , object_pairs_hook = None , list_hook = None ,
@@ -393,117 +395,117 @@ def _read_header(self, execute=EX_CONSTRUCT):
393395 elif b == 0xc5 :
394396 typ = TYPE_BIN
395397 self ._reserve (2 )
396- n = self . _unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
398+ n = _unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
397399 self ._buff_i += 2
398400 if n > self ._max_bin_len :
399401 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
400402 obj = self ._read (n )
401403 elif b == 0xc6 :
402404 typ = TYPE_BIN
403405 self ._reserve (4 )
404- n = self . _unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
406+ n = _unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
405407 self ._buff_i += 4
406408 if n > self ._max_bin_len :
407409 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
408410 obj = self ._read (n )
409411 elif b == 0xc7 : # ext 8
410412 typ = TYPE_EXT
411413 self ._reserve (2 )
412- L , n = self . _unpack_from ('Bb' , self ._buffer , self ._buff_i )
414+ L , n = _unpack_from ('Bb' , self ._buffer , self ._buff_i )
413415 self ._buff_i += 2
414416 if L > self ._max_ext_len :
415417 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
416418 obj = self ._read (L )
417419 elif b == 0xc8 : # ext 16
418420 typ = TYPE_EXT
419421 self ._reserve (3 )
420- L , n = self . _unpack_from ('>Hb' , self ._buffer , self ._buff_i )
422+ L , n = _unpack_from ('>Hb' , self ._buffer , self ._buff_i )
421423 self ._buff_i += 3
422424 if L > self ._max_ext_len :
423425 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
424426 obj = self ._read (L )
425427 elif b == 0xc9 : # ext 32
426428 typ = TYPE_EXT
427429 self ._reserve (5 )
428- L , n = self . _unpack_from ('>Ib' , self ._buffer , self ._buff_i )
430+ L , n = _unpack_from ('>Ib' , self ._buffer , self ._buff_i )
429431 self ._buff_i += 5
430432 if L > self ._max_ext_len :
431433 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
432434 obj = self ._read (L )
433435 elif b == 0xca :
434436 self ._reserve (4 )
435- obj = self . _unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
437+ obj = _unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
436438 self ._buff_i += 4
437439 elif b == 0xcb :
438440 self ._reserve (8 )
439- obj = self . _unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
441+ obj = _unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
440442 self ._buff_i += 8
441443 elif b == 0xcc :
442444 self ._reserve (1 )
443445 obj = self ._buffer [self ._buff_i ]
444446 self ._buff_i += 1
445447 elif b == 0xcd :
446448 self ._reserve (2 )
447- obj = self . _unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
449+ obj = _unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
448450 self ._buff_i += 2
449451 elif b == 0xce :
450452 self ._reserve (4 )
451- obj = self . _unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
453+ obj = _unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
452454 self ._buff_i += 4
453455 elif b == 0xcf :
454456 self ._reserve (8 )
455- obj = self . _unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
457+ obj = _unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
456458 self ._buff_i += 8
457459 elif b == 0xd0 :
458460 self ._reserve (1 )
459- obj = self . _unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
461+ obj = _unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
460462 self ._buff_i += 1
461463 elif b == 0xd1 :
462464 self ._reserve (2 )
463- obj = self . _unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
465+ obj = _unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
464466 self ._buff_i += 2
465467 elif b == 0xd2 :
466468 self ._reserve (4 )
467- obj = self . _unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
469+ obj = _unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
468470 self ._buff_i += 4
469471 elif b == 0xd3 :
470472 self ._reserve (8 )
471- obj = self . _unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
473+ obj = _unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
472474 self ._buff_i += 8
473475 elif b == 0xd4 : # fixext 1
474476 typ = TYPE_EXT
475477 if self ._max_ext_len < 1 :
476478 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
477479 self ._reserve (2 )
478- n , obj = self . _unpack_from ("b1s" , self ._buffer , self ._buff_i )
480+ n , obj = _unpack_from ("b1s" , self ._buffer , self ._buff_i )
479481 self ._buff_i += 2
480482 elif b == 0xd5 : # fixext 2
481483 typ = TYPE_EXT
482484 if self ._max_ext_len < 2 :
483485 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
484486 self ._reserve (3 )
485- n , obj = self . _unpack_from ("b2s" , self ._buffer , self ._buff_i )
487+ n , obj = _unpack_from ("b2s" , self ._buffer , self ._buff_i )
486488 self ._buff_i += 3
487489 elif b == 0xd6 : # fixext 4
488490 typ = TYPE_EXT
489491 if self ._max_ext_len < 4 :
490492 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
491493 self ._reserve (5 )
492- n , obj = self . _unpack_from ("b4s" , self ._buffer , self ._buff_i )
494+ n , obj = _unpack_from ("b4s" , self ._buffer , self ._buff_i )
493495 self ._buff_i += 5
494496 elif b == 0xd7 : # fixext 8
495497 typ = TYPE_EXT
496498 if self ._max_ext_len < 8 :
497499 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
498500 self ._reserve (9 )
499- n , obj = self . _unpack_from ("b8s" , self ._buffer , self ._buff_i )
501+ n , obj = _unpack_from ("b8s" , self ._buffer , self ._buff_i )
500502 self ._buff_i += 9
501503 elif b == 0xd8 : # fixext 16
502504 typ = TYPE_EXT
503505 if self ._max_ext_len < 16 :
504506 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
505507 self ._reserve (17 )
506- n , obj = self . _unpack_from ("b16s" , self ._buffer , self ._buff_i )
508+ n , obj = _unpack_from ("b16s" , self ._buffer , self ._buff_i )
507509 self ._buff_i += 17
508510 elif b == 0xd9 :
509511 typ = TYPE_RAW
@@ -516,43 +518,43 @@ def _read_header(self, execute=EX_CONSTRUCT):
516518 elif b == 0xda :
517519 typ = TYPE_RAW
518520 self ._reserve (2 )
519- n , = self . _unpack_from (">H" , self ._buffer , self ._buff_i )
521+ n , = _unpack_from (">H" , self ._buffer , self ._buff_i )
520522 self ._buff_i += 2
521523 if n > self ._max_str_len :
522524 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
523525 obj = self ._read (n )
524526 elif b == 0xdb :
525527 typ = TYPE_RAW
526528 self ._reserve (4 )
527- n , = self . _unpack_from (">I" , self ._buffer , self ._buff_i )
529+ n , = _unpack_from (">I" , self ._buffer , self ._buff_i )
528530 self ._buff_i += 4
529531 if n > self ._max_str_len :
530532 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
531533 obj = self ._read (n )
532534 elif b == 0xdc :
533535 typ = TYPE_ARRAY
534536 self ._reserve (2 )
535- n , = self . _unpack_from (">H" , self ._buffer , self ._buff_i )
537+ n , = _unpack_from (">H" , self ._buffer , self ._buff_i )
536538 self ._buff_i += 2
537539 if n > self ._max_array_len :
538540 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
539541 elif b == 0xdd :
540542 typ = TYPE_ARRAY
541543 self ._reserve (4 )
542- n , = self . _unpack_from (">I" , self ._buffer , self ._buff_i )
544+ n , = _unpack_from (">I" , self ._buffer , self ._buff_i )
543545 self ._buff_i += 4
544546 if n > self ._max_array_len :
545547 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
546548 elif b == 0xde :
547549 self ._reserve (2 )
548- n , = self . _unpack_from (">H" , self ._buffer , self ._buff_i )
550+ n , = _unpack_from (">H" , self ._buffer , self ._buff_i )
549551 self ._buff_i += 2
550552 if n > self ._max_map_len :
551553 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
552554 typ = TYPE_MAP
553555 elif b == 0xdf :
554556 self ._reserve (4 )
555- n , = self . _unpack_from (">I" , self ._buffer , self ._buff_i )
557+ n , = _unpack_from (">I" , self ._buffer , self ._buff_i )
556558 self ._buff_i += 4
557559 if n > self ._max_map_len :
558560 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
0 commit comments