8000 Merge branch 'master' into next-marker · loude/msgpack-python@a27f8f9 · GitHub
[go: up one dir, main page]

Skip to content

Commit a27f8f9

Browse files
committed
Merge branch 'master' into next-marker
Conflicts: msgpack/fallback.py
2 parents 62d209c + 04e0812 commit a27f8f9

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

msgpack/_unpacker.pyx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,8 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
113113
if off < buf_len:
114114
raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off))
115115
return obj
116-
elif ret < 0:
117-
raise ValueError("Unpack failed: error = %d" % (ret,))
118116
else:
119-
raise UnpackValueError
117+
raise UnpackValueError("Unpack failed: error = %d" % (ret,))
120118

121119

122120
def unpack(object stream, object object_hook=None, object list_hook=None,

msgpack/fallback.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def dict_iteritems(d):
2222
if hasattr(sys, 'pypy_version_info'):
2323
# cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own
2424
# StringBuilder is fastest.
25+
from __pypy__ import newlist_hint
2526
from __pypy__.builders import StringBuilder
2627
USING_STRINGBUILDER = True
2728
class StringIO(object):
@@ -38,6 +39,7 @@ def getvalue(self):
3839
else:
3940
USING_STRINGBUILDER = False
4041
from io import BytesIO as StringIO
42+
newlist_hint = lambda size: []
4143

4244
from msgpack.exceptions import (
4345
BufferFull,
@@ -100,7 +102,10 @@ def unpackb(packed, object_hook=None, list_hook=None, use_list=True,
100102
encoding=encoding, unicode_errors=unicode_errors,
101103
object_pairs_hook=object_pairs_hook)
102104
unpacker.feed(packed)
103-
ret = unpacker._fb_unpack()
105+
try:
106+
ret = unpacker._fb_unpack()
107+
except OutOfData:
108+
raise UnpackValueError("Data is not enough.")
104109
if unpacker._fb_got_extradata():
105110
raise ExtraData(ret, unpacker._fb_get_extradata())
106111
return ret
@@ -266,8 +271,10 @@ def _fb_read(self, n, write_bytes=None):
266271
write_bytes(ret)
267272
return ret
268273

269-
def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
274+
def _read_header(self, execute=EX_CONSTRUCT, write_bytes=None):
270275
typ = TYPE_IMMEDIATE
276+
n = 0
277+
obj = None
271278
c = self._fb_read(1, write_bytes)
272279
b = ord(c)
273280
B38A if b & 0b10000000 == 0:
@@ -341,6 +348,11 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
341348
typ = TYPE_MAP
342349
else:
343350
raise UnpackValueError("Unknown header: 0x%x" % b)
351+
return typ, n, obj
352+
353+
def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
354+
typ, n, obj = self._read_header(execute, write_bytes)
355+
344356
if execute == EX_CONSTRUCT_SIMPLE:
345357
if typ in (TYPE_ARRAY, TYPE_MAP):
346358
return (typ, n)
@@ -359,7 +371,7 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
359371
# TODO check whether we need to call `list_hook`
360372
self._fb_unpack(EX_SKIP, write_bytes)
361373
return
362-
ret = []
374+
ret = newlist_hint(n)
363375
for i in xrange(n):
364376
ret.append(self._fb_unpack(EX_CONSTRUCT, write_bytes))
365377
if self._list_hook is not None:

0 commit comments

Comments
 (0)
0