@@ -22,6 +22,7 @@ def dict_iteritems(d):
22
22
if hasattr (sys , 'pypy_version_info' ):
23
23
# cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own
24
24
# StringBuilder is fastest.
25
+ from __pypy__ import newlist_hint
25
26
from __pypy__ .builders import StringBuilder
26
27
USING_STRINGBUILDER = True
27
28
class StringIO (object ):
@@ -38,6 +39,7 @@ def getvalue(self):
38
39
else :
39
40
USING_STRINGBUILDER = False
40
41
from io import BytesIO as StringIO
42
+ newlist_hint = lambda size : []
41
43
42
44
from msgpack .exceptions import (
43
45
BufferFull ,
@@ -100,7 +102,10 @@ def unpackb(packed, object_hook=None, list_hook=None, use_list=True,
100
102
encoding = encoding , unicode_errors = unicode_errors ,
101
103
object_pairs_hook = object_pairs_hook )
102
104
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." )
104
109
if unpacker ._fb_got_extradata ():
105
110
raise ExtraData (ret , unpacker ._fb_get_extradata ())
106
111
return ret
@@ -266,8 +271,10 @@ def _fb_read(self, n, write_bytes=None):
266
271
write_bytes (ret )
267
272
return ret
268
273
269
- def _fb_unpack (self , execute = EX_CONSTRUCT , write_bytes = None ):
274
+ def _read_header (self , execute = EX_CONSTRUCT , write_bytes = None ):
270
275
typ = TYPE_IMMEDIATE
276
+ n = 0
277
+ obj = None
271
278
c = self ._fb_read (1 , write_bytes )
272
279
b = ord (c )
273
280
B38A
if b & 0b10000000 == 0 :
@@ -341,6 +348,11 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
341
348
typ = TYPE_MAP
342
349
else :
343
350
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
+
344
356
if execute == EX_CONSTRUCT_SIMPLE :
345
357
if typ in (TYPE_ARRAY , TYPE_MAP ):
346
358
return (typ , n )
@@ -359,7 +371,7 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
359
371
# TODO check whether we need to call `list_hook`
360
372
self ._fb_unpack (EX_SKIP , write_bytes )
361
373
return
362
- ret = []
374
+ ret = newlist_hint ( n )
363
375
for i in xrange (n ):
364
376
ret .append (self ._fb_unpack (EX_CONSTRUCT , write_bytes ))
365
377
if self ._list_hook is not None :
0 commit comments