summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorINADA Naoki <songofacandy@gmail.com>2013-10-17 09:15:19 +0900
committerINADA Naoki <songofacandy@gmail.com>2013-10-17 09:15:19 +0900
commit85eaff344b74092ccf076ba2465e9bdb1537409b (patch)
tree0a76eb69cceebb89472eba3279afc64f1efcd1a9
parent84f6b100190049a5d1bceb916208eeae2a3d2591 (diff)
downloadmsgpack-python-85eaff344b74092ccf076ba2465e9bdb1537409b.tar.gz
Add bin type support for fallback Unpacker.
-rw-r--r--msgpack/__init__.py2
-rw-r--r--msgpack/_unpacker.pyx1
-rw-r--r--msgpack/fallback.py19
3 files changed, 20 insertions, 2 deletions
diff --git a/msgpack/__init__.py b/msgpack/__init__.py
index 5ce531e..7f0519e 100644
--- a/msgpack/__init__.py
+++ b/msgpack/__init__.py
@@ -10,7 +10,7 @@ else:
from msgpack._packer import Packer
from msgpack._unpacker import unpack, unpackb, Unpacker
except ImportError:
- from msgpack.fallback import pack, packb, Packer, unpack, unpackb, Unpacker
+ from msgpack.fallback import Packer, unpack, unpackb, Unpacker
def pack(o, stream, **kwargs):
diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx
index 1f4dd85..7b0c8a6 100644
--- a/msgpack/_unpacker.pyx
+++ b/msgpack/_unpacker.pyx
@@ -18,7 +18,6 @@ from msgpack.exceptions import (
)
-
cdef extern from "unpack.h":
ctypedef struct msgpack_user:
bint use_list
diff --git a/msgpack/fallback.py b/msgpack/fallback.py
index 49a2bc5..901c6c8 100644
--- a/msgpack/fallback.py
+++ b/msgpack/fallback.py
@@ -57,6 +57,7 @@ TYPE_IMMEDIATE = 0
TYPE_ARRAY = 1
TYPE_MAP = 2
TYPE_RAW = 3
+TYPE_BIN = 4
DEFAULT_RECURSE_LIMIT=511
@@ -297,6 +298,10 @@ class Unpacker(object):
obj = struct.unpack(">i", self._fb_read(4, write_bytes))[0]
elif b == 0xd3:
obj = struct.unpack(">q", self._fb_read(8, write_bytes))[0]
+ elif b == 0xd9:
+ n = struct.unpack("B", self._fb_read(1, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
+ typ = TYPE_RAW
elif b == 0xda:
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
obj = self._fb_read(n, write_bytes)
@@ -305,6 +310,18 @@ class Unpacker(object):
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
obj = self._fb_read(n, write_bytes)
typ = TYPE_RAW
+ elif b == 0xc4:
+ n = struct.unpack("B", self._fb_read(1, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
+ typ = TYPE_BIN
+ elif b == 0xc5:
+ n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
+ typ = TYPE_BIN
+ elif b == 0xc6:
+ n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
+ typ = TYPE_BIN
elif b == 0xdc:
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
typ = TYPE_ARRAY
@@ -373,6 +390,8 @@ class Unpacker(object):
if self._encoding is not None:
obj = obj.decode(self._encoding, self._unicode_errors)
return obj
+ if typ == TYPE_BIN:
+ return obj
assert typ == TYPE_IMMEDIATE
return obj