8000 refactor header packing for str and bin types · lbolla/msgpack-python@5860af9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5860af9

Browse files
committed
refactor header packing for str and bin types
1 parent 0b55989 commit 5860af9

File tree

1 file changed

+39
-44
lines changed

1 file changed

+39
-44
lines changed

msgpack/fallback.py

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -685,58 +685,29 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT,
685685
default_used = True
686686
continue
687687
raise PackOverflowError("Integer value out of range")
688-
if self._use_bin_type and check(obj, bytes):
688+
if check(obj, bytes):
689689
n = len(obj)
690-
if n <= 0xff:
691-
self._buffer.write(struct.pack('>BB', 0xc4, n))
692-
elif n <= 0xffff:
693-
self._buffer.write(struct.pack(">BH", 0xc5, n))
694-
elif n <= 0xffffffff:
695-
self._buffer.write(struct.pack(">BI", 0xc6, n))
696-
else:
690+
if n >= 2**32:
697691
raise PackValueError("Bytes is too large")
692+
self._fb_pack_bin_header(n)
698693
return self._buffer.write(obj)
699-
if check(obj, (Unicode, bytes)):
700-
if check(obj, Unicode):
701-
if self._encoding is None:
702-
raise TypeError(
703-
"Can't encode unicode string: "
704-
"no encoding is specified")
705-
obj = obj.encode(self._encoding, self._unicode_errors)
694+
if check(obj, Unicode):
695+
if self._encoding is None:
696+
raise TypeError(
697+
"Can't encode unicode string: "
698+
"no encoding is specified")
699+
obj = obj.encode(self._encoding, self._unicode_errors)
706700
n = len(obj)
707-
if n <= 0x1f:
708-
self._buffer.write(struct.pack('B', 0xa0 + n))
709-
elif self._use_bin_type and n <= 0xff:
710-
self._buffer.write(struct.pack('>BB', 0xd9, n))
711-
elif n <= 0xffff:
712-
self._buffer.write(struct.pack(">BH", 0xda, n))
713-
elif n <= 0xffffffff:
714-
self._buffer.write(struct.pack(">BI", 0xdb, n))
715-
else:
701+
if n >= 2**32:
716702
raise PackValueError("String is too large")
703+
self._fb_pack_raw_header(n)
717704
return self._buffer.write(obj)
718705
if check(obj, memoryview):
719706
n = len(obj) * obj.itemsize
720-
if self._use_bin_type:
721-
if n <= 0xff:
722-
self._buffer.write(struct.pack('>BB', 0xc4, n))
723-
elif n <= 0xffff:
724-
self._buffer.write(struct.pack(">BH", 0xc5, n))
725-
elif n <= 0xffffffff:
726-
self._buffer.write(struct.pack(">BI", 0xc6, n))
727-
else:
728-
raise PackValueError("memoryview is too large")
729-
return self._buffer.write(obj)
730-
else:
731-
if n <= 0x1f:
732-
self._buffer.write(struct.pack('B', 0xa0 + n))
733-
elif n <= 0xffff:
734-
self._buffer.write(struct.pack(">BH", 0xda, n))
735-
elif n <= 0xffffffff:
736-
self._buffer.write(struct.pack(">BI", 0xdb, n))
737-
else:
738-
raise PackValueError("memoryview is too large")
739-
return self._buffer.write(obj)
707+
if n >= 2**32:
708+
raise PackValueError("Memoryview is too large")
709+
self._fb_pack_bin_header(n)
710+
return self._buffer.write(obj)
740711
if check(obj, float):
741712
if self._use_float:
742713
return self._buffer.write(struct.pack(">Bf", 0xca, obj))
@@ -874,6 +845,30 @@ def _fb_pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
874845
self._pack(k, nest_limit - 1)
875846
self._pack(v, nest_limit - 1)
876847

848+
def _fb_pack_raw_header(self, n):
849+
if n <= 0x1f:
850+
self._buffer.write(struct.pack('B', 0xa0 + n))
851+
elif self._use_bin_type and n <= 0xff:
852+
self._buffer.write(struct.pack('>BB', 0xd9, n))
853+
elif n <= 0xffff:
854+
self._buffer.write(struct.pack(">BH", 0xda, n))
855+
elif n <= 0xffffffff:
856+
self._buffer.write(struct.pack(">BI", 0xdb, n))
857+
else:
858+
raise PackValueError('Raw is too large')
859+
860+
def _fb_pack_bin_header(self, n):
861+
if not self._use_bin_type:
862+
return self._fb_pack_raw_header(n)
863+
elif n <= 0xff:
864+
return self._buffer.write(struct.pack('>BB', 0xc4, n))
865+
elif n <= 0xffff:
866+
return self._buffer.write(struct.pack(">BH", 0xc5, n))
867+
elif n <= 0xffffffff:
868+
return self._buffer.write(struct.pack(">BI", 0xc6, n))
869+
else:
870+
raise PackValueError('Bin is too large')
871+
877872
def bytes(self):
878873
return self._buffer.getvalue()
879874

0 commit comments

Comments
 (0)
0