@@ -100,13 +100,6 @@ def _get_data_from_buffer(obj):
100100 return view
101101
102102
103- # Jython's memoryview support is incomplete
104- # See https://github.com/msgpack/msgpack-python/issues/303
105- _is_jython = sys .platform .startswith ('java' )
106- if _is_jython :
107- _get_data_from_buffer = bytes
108-
109-
110103def unpack (stream , ** kwargs ):
111104 warnings .warn (
112105 "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead." ,
@@ -133,6 +126,14 @@ def unpackb(packed, **kwargs):
133126 return ret
134127
135128
129+ if sys .version_info < (2 , 7 , 6 ):
130+ def _unpack_from (f , b , o = 0 ):
131+ """Explicit typcast for legacy struct.unpack_from"""
132+ return struct .unpack_from (f , bytes (b ), o )
133+ else :
134+ _unpack_from = struct .unpack_from
135+
136+
136137class Unpacker (object ):
137138 """Streaming unpacker.
138139
@@ -241,12 +242,6 @@ def __init__(self, file_like=None, read_size=0, use_list=True, raw=True,
241242
242243 #: array of bytes fed.
243244 self ._buffer = bytearray ()
244- # Some very old pythons don't support `struct.unpack_from()` with a
245- # `bytearray`. So we wrap it in a `buffer()` there.
246- if sys .version_info < (2 , 7 , 6 ):
247- self ._buffer_view = buffer (self ._buffer )
248- else :
249- self ._buffer_view = self ._buffer
250245 #: Which position we currently reads
251246 self ._buff_i = 0
252247
@@ -302,7 +297,8 @@ def feed(self, next_bytes):
302297 self ._buff_i -= self ._buf_checkpoint
303298 self ._buf_checkpoint = 0
304299
305- self ._buffer += view
300+ # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
301+ self ._buffer .extend (view )
306302
307303 def _consume (self ):
308304 """ Gets rid of the used parts of the buffer. """
@@ -401,117 +397,117 @@ def _read_header(self, execute=EX_CONSTRUCT):
401397 elif b == 0xc5 :
402398 typ = TYPE_BIN
403399 self ._reserve (2 )
404- n = struct . unpack_from (">H" , self ._buffer_view , self ._buff_i )[0 ]
400+ n = _unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
405401 self ._buff_i += 2
406402 if n > self ._max_bin_len :
407403 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
408404 obj = self ._read (n )
409405 elif b == 0xc6 :
410406 typ = TYPE_BIN
411407 self ._reserve (4 )
412- n = struct . unpack_from (">I" , self ._buffer_view , self ._buff_i )[0 ]
408+ n = _unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
413409 self ._buff_i += 4
414410 if n > self ._max_bin_len :
415411 raise UnpackValueError ("%s exceeds max_bin_len(%s)" % (n , self ._max_bin_len ))
416412 obj = self ._read (n )
417413 elif b == 0xc7 : # ext 8
418414 typ = TYPE_EXT
419415 self ._reserve (2 )
420- L , n = struct . unpack_from ('Bb' , self ._buffer_view , self ._buff_i )
416+ L , n = _unpack_from ('Bb' , self ._buffer , self ._buff_i )
421417 self ._buff_i += 2
422418 if L > self ._max_ext_len :
423419 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
424420 obj = self ._read (L )
425421 elif b == 0xc8 : # ext 16
426422 typ = TYPE_EXT
427423 self ._reserve (3 )
428- L , n = struct . unpack_from ('>Hb' , self ._buffer_view , self ._buff_i )
424+ L , n = _unpack_from ('>Hb' , self ._buffer , self ._buff_i )
429425 self ._buff_i += 3
430426 if L > self ._max_ext_len :
431427 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
432428 obj = self ._read (L )
433429 elif b == 0xc9 : # ext 32
434430 typ = TYPE_EXT
435431 self ._reserve (5 )
436- L , n = struct . unpack_from ('>Ib' , self ._buffer_view , self ._buff_i )
432+ L , n = _unpack_from ('>Ib' , self ._buffer , self ._buff_i )
437433 self ._buff_i += 5
438434 if L > self ._max_ext_len :
439435 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (L , self ._max_ext_len ))
440436 obj = self ._read (L )
441437 elif b == 0xca :
442438 self ._reserve (4 )
443- obj = struct . unpack_from (">f" , self ._buffer_view , self ._buff_i )[0 ]
439+ obj = _unpack_from (">f" , self ._buffer , self ._buff_i )[0 ]
444440 self ._buff_i += 4
445441 elif b == 0xcb :
446442 self ._reserve (8 )
447- obj = struct . unpack_from (">d" , self ._buffer_view , self ._buff_i )[0 ]
443+ obj = _unpack_from (">d" , self ._buffer , self ._buff_i )[0 ]
448444 self ._buff_i += 8
449445 elif b == 0xcc :
450446 self ._reserve (1 )
451447 obj = self ._buffer [self ._buff_i ]
452448 self ._buff_i += 1
453449 elif b == 0xcd :
454450 self ._reserve (2 )
455- obj = struct . unpack_from (">H" , self ._buffer_view , self ._buff_i )[0 ]
451+ obj = _unpack_from (">H" , self ._buffer , self ._buff_i )[0 ]
456452 self ._buff_i += 2
457453 elif b == 0xce :
458454 self ._reserve (4 )
459- obj = struct . unpack_from (">I" , self ._buffer_view , self ._buff_i )[0 ]
455+ obj = _unpack_from (">I" , self ._buffer , self ._buff_i )[0 ]
460456 self ._buff_i += 4
461457 elif b == 0xcf :
462458 self ._reserve (8 )
463- obj = struct . unpack_from (">Q" , self ._buffer_view , self ._buff_i )[0 ]
459+ obj = _unpack_from (">Q" , self ._buffer , self ._buff_i )[0 ]
464460 self ._buff_i += 8
465461 elif b == 0xd0 :
466462 self ._reserve (1 )
467- obj = struct . unpack_from ("b" , self ._buffer_view , self ._buff_i )[0 ]
463+ obj = _unpack_from ("b" , self ._buffer , self ._buff_i )[0 ]
468464 self ._buff_i += 1
469465 elif b == 0xd1 :
470466 self ._reserve (2 )
471- obj = struct . unpack_from (">h" , self ._buffer_view , self ._buff_i )[0 ]
467+ obj = _unpack_from (">h" , self ._buffer , self ._buff_i )[0 ]
472468 self ._buff_i += 2
473469 elif b == 0xd2 :
474470 self ._reserve (4 )
475- obj = struct . unpack_from (">i" , self ._buffer_view , self ._buff_i )[0 ]
471+ obj = _unpack_from (">i" , self ._buffer , self ._buff_i )[0 ]
476472 self ._buff_i += 4
477473 elif b == 0xd3 :
478474 self ._reserve (8 )
479- obj = struct . unpack_from (">q" , self ._buffer_view , self ._buff_i )[0 ]
475+ obj = _unpack_from (">q" , self ._buffer , self ._buff_i )[0 ]
480476 self ._buff_i += 8
481477 elif b == 0xd4 : # fixext 1
482478 typ = TYPE_EXT
483479 if self ._max_ext_len < 1 :
484480 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (1 , self ._max_ext_len ))
485481 self ._reserve (2 )
486- n , obj = struct . unpack_from ("b1s" , self ._buffer_view , self ._buff_i )
482+ n , obj = _unpack_from ("b1s" , self ._buffer , self ._buff_i )
487483 self ._buff_i += 2
488484 elif b == 0xd5 : # fixext 2
489485 typ = TYPE_EXT
490486 if self ._max_ext_len < 2 :
491487 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (2 , self ._max_ext_len ))
492488 self ._reserve (3 )
493- n , obj = struct . unpack_from ("b2s" , self ._buffer_view , self ._buff_i )
489+ n , obj = _unpack_from ("b2s" , self ._buffer , self ._buff_i )
494490 self ._buff_i += 3
495491 elif b == 0xd6 : # fixext 4
496492 typ = TYPE_EXT
497493 if self ._max_ext_len < 4 :
498494 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (4 , self ._max_ext_len ))
499495 self ._reserve (5 )
500- n , obj = struct . unpack_from ("b4s" , self ._buffer_view , self ._buff_i )
496+ n , obj = _unpack_from ("b4s" , self ._buffer , self ._buff_i )
501497 self ._buff_i += 5
502498 elif b == 0xd7 : # fixext 8
503499 typ = TYPE_EXT
504500 if self ._max_ext_len < 8 :
505501 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (8 , self ._max_ext_len ))
506502 self ._reserve (9 )
507- n , obj = struct . unpack_from ("b8s" , self ._buffer_view , self ._buff_i )
503+ n , obj = _unpack_from ("b8s" , self ._buffer , self ._buff_i )
508504 self ._buff_i += 9
509505 elif b == 0xd8 : # fixext 16
510506 typ = TYPE_EXT
511507 if self ._max_ext_len < 16 :
512508 raise UnpackValueError ("%s exceeds max_ext_len(%s)" % (16 , self ._max_ext_len ))
513509 self ._reserve (17 )
514- n , obj = struct . unpack_from ("b16s" , self ._buffer_view , self ._buff_i )
510+ n , obj = _unpack_from ("b16s" , self ._buffer , self ._buff_i )
515511 self ._buff_i += 17
516512 elif b == 0xd9 :
517513 typ = TYPE_RAW
@@ -524,43 +520,43 @@ def _read_header(self, execute=EX_CONSTRUCT):
524520 elif b == 0xda :
525521 typ = TYPE_RAW
526522 self ._reserve (2 )
527- n , = struct . unpack_from (">H" , self ._buffer_view , self ._buff_i )
523+ n , = _unpack_from (">H" , self ._buffer , self ._buff_i )
528524 self ._buff_i += 2
529525 if n > self ._max_str_len :
530526 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
531527 obj = self ._read (n )
532528 elif b == 0xdb :
533529 typ = TYPE_RAW
534530 self ._reserve (4 )
535- n , = struct . unpack_from (">I" , self ._buffer_view , self ._buff_i )
531+ n , = _unpack_from (">I" , self ._buffer , self ._buff_i )
536532 self ._buff_i += 4
537533 if n > self ._max_str_len :
538534 raise UnpackValueError ("%s exceeds max_str_len(%s)" , n , self ._max_str_len )
539535 obj = self ._read (n )
540536 elif b == 0xdc :
541537 typ = TYPE_ARRAY
542538 self ._reserve (2 )
543- n , = struct . unpack_from (">H" , self ._buffer_view , self ._buff_i )
539+ n , = _unpack_from (">H" , self ._buffer , self ._buff_i )
544540 self ._buff_i += 2
545541 if n > self ._max_array_len :
546542 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
547543 elif b == 0xdd :
548544 typ = TYPE_ARRAY
549545 self ._reserve (4 )
550- n , = struct . unpack_from (">I" , self ._buffer_view , self ._buff_i )
546+ n , = _unpack_from (">I" , self ._buffer , self ._buff_i )
551547 self ._buff_i += 4
552548 if n > self ._max_array_len :
553549 raise UnpackValueError ("%s exceeds max_array_len(%s)" , n , self ._max_array_len )
554550 elif b == 0xde :
555551 self ._reserve (2 )
556- n , = struct . unpack_from (">H" , self ._buffer_view , self ._buff_i )
552+ n , = _unpack_from (">H" , self ._buffer , self ._buff_i )
557553 self ._buff_i += 2
558554 if n > self ._max_map_len :
559555 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
560556 typ = TYPE_MAP
561557 elif b == 0xdf :
562558 self ._reserve (4 )
563- n , = struct . unpack_from (">I" , self ._buffer_view , self ._buff_i )
559+ n , = _unpack_from (">I" , self ._buffer , self ._buff_i )
564560 self ._buff_i += 4
565561 if n > self ._max_map_len :
566562 raise UnpackValueError ("%s exceeds max_map_len(%s)" , n , self ._max_map_len )
0 commit comments