summaryrefslogtreecommitdiff
path: root/msgpack/fallback.py
diff options
context:
space:
mode:
authorfolz <joachim.folz@dfki.de>2016-04-28 15:08:28 +0200
committerfolz <joachim.folz@dfki.de>2016-05-03 16:55:14 +0200
commit0ec2e3534f9b7751be484bd2f1344e24c49bb24f (patch)
tree156079306a3f427617aad93910bd16d546e8a804 /msgpack/fallback.py
parentceb9635a3f4d7f3dd4874b98773ca6f7db9296a7 (diff)
downloadmsgpack-python-0ec2e3534f9b7751be484bd2f1344e24c49bb24f.tar.gz
fix problems associated with packing memoryviews
fix wrong length when packing multibyte memoryviews in fallback add tests for memoryviews of different types and sizes and check contents of packed data
Diffstat (limited to 'msgpack/fallback.py')
-rw-r--r--msgpack/fallback.py26
1 files changed, 24 insertions, 2 deletions
diff --git a/msgpack/fallback.py b/msgpack/fallback.py
index d8c5d73..db47d5c 100644
--- a/msgpack/fallback.py
+++ b/msgpack/fallback.py
@@ -685,7 +685,7 @@ class Packer(object):
default_used = True
continue
raise PackOverflowError("Integer value out of range")
- if self._use_bin_type and check(obj, (bytes, memoryview)):
+ if self._use_bin_type and check(obj, bytes):
n = len(obj)
if n <= 0xff:
self._buffer.write(struct.pack('>BB', 0xc4, n))
@@ -696,7 +696,7 @@ class Packer(object):
else:
raise PackValueError("Bytes is too large")
return self._buffer.write(obj)
- if check(obj, (Unicode, bytes, memoryview)):
+ if check(obj, (Unicode, bytes)):
if check(obj, Unicode):
if self._encoding is None:
raise TypeError(
@@ -715,6 +715,28 @@ class Packer(object):
else:
raise PackValueError("String is too large")
return self._buffer.write(obj)
+ if check(obj, memoryview):
+ n = len(obj) * obj.itemsize
+ if self._use_bin_type:
+ if n <= 0xff:
+ self._buffer.write(struct.pack('>BB', 0xc4, n))
+ elif n <= 0xffff:
+ self._buffer.write(struct.pack(">BH", 0xc5, n))
+ elif n <= 0xffffffff:
+ self._buffer.write(struct.pack(">BI", 0xc6, n))
+ else:
+ raise PackValueError("memoryview is too large")
+ return self._buffer.write(obj)
+ else:
+ if n <= 0x1f:
+ self._buffer.write(struct.pack('B', 0xa0 + n))
+ elif n <= 0xffff:
+ self._buffer.write(struct.pack(">BH", 0xda, n))
+ elif n <= 0xffffffff:
+ self._buffer.write(struct.pack(">BI", 0xdb, n))
+ else:
+ raise PackValueError("memoryview is too large")
+ return self._buffer.write(obj)
if check(obj, float):
if self._use_float:
return self._buffer.write(struct.pack(">Bf", 0xca, obj))