Skip to content

Commit 70b5f21

Browse files
devendormethane
authored andcommitted
Alternate fixes for jython and legacy CPython (#310)
Python 3.4 is not supported officially. But keep running test for a while, to know when msgpack-python stop working on Python 3.4 actually. The current patches did not work under jython-2.7.1 where implicit casting of buffer or memoryview doesn't work. It may also be the jython is a little pickier about string casting non string bytes due to the underlying strong typing of java. See issues #303 & #304.
1 parent d1060de commit 70b5f21

File tree

1 file changed

+35
-39
lines changed

1 file changed

+35
-39
lines changed

msgpack/fallback.py

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
110103
def 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+
136137
class 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

Comments
 (0)