Skip to content

Commit 88a8904

Browse files
committed
Rolls back legacy python and jython fixes in favor of implicit type
casting. 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. Rolls back / replaces: aa41e2f 5f684ae b10cf78
1 parent 6494e91 commit 88a8904

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

msgpack/fallback.py

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)