44import array
55import struct
66
7+ if sys .version_info [0 ] == 3 :
8+ PY3 = True
9+ int_types = int
10+ Unicode = str
11+ xrange = range
12+ def dict_iteritems (d ):
13+ return d .items ()
14+ else :
15+ PY3 = False
16+ int_types = (int , long )
17+ Unicode = unicode
18+ def dict_iteritems (d ):
19+ return d .iteritems ()
20+
21+
722if hasattr (sys , 'pypy_version_info' ):
823 # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own
924 # StringBuilder is fastest.
1025 from __pypy__ .builders import StringBuilder
1126 USING_STRINGBUILDER = True
1227 class StringIO (object ):
13- def __init__ (self , s = '' ):
28+ def __init__ (self , s = b '' ):
1429 if s :
1530 self .builder = StringBuilder (len (s ))
1631 self .builder .append (s )
@@ -22,10 +37,7 @@ def getvalue(self):
2237 return self .builder .build ()
2338else :
2439 USING_STRINGBUILDER = False
25- try :
26- from cStringIO import StringIO
27- except ImportError :
28- from StringIO import StringIO
40+ from io import BytesIO as StringIO
2941
3042from msgpack .exceptions import (
3143 BufferFull ,
@@ -156,7 +168,7 @@ def __init__(self, file_like=None, read_size=0, use_list=True,
156168 self ._fb_buf_o = 0
157169 self ._fb_buf_i = 0
158170 self ._fb_buf_n = 0
159- self .max_buffer_size = (sys . maxint if max_buffer_size == 0
171+ self .max_buffer_size = (2 ** 31 - 1 if max_buffer_size == 0
160172 else max_buffer_size )
161173 self .read_size = (read_size if read_size != 0
162174 else min (self .max_buffer_size , 2048 ))
@@ -221,15 +233,15 @@ def _fb_get_extradata(self):
221233 bufs = self ._fb_buffers [self ._fb_buf_i :]
222234 if bufs :
223235 bufs [0 ] = bufs [0 ][self ._fb_buf_o :]
224- return '' .join (bufs )
236+ return b '' .join (bufs )
225237
226238 def _fb_read (self , n , write_bytes = None ):
227239 if (write_bytes is None and self ._fb_buf_i < len (self ._fb_buffers )
228240 and self ._fb_buf_o + n < len (self ._fb_buffers [self ._fb_buf_i ])):
229241 self ._fb_buf_o += n
230242 return self ._fb_buffers [self ._fb_buf_i ][
231243 self ._fb_buf_o - n :self ._fb_buf_o ]
232- ret = ''
244+ ret = b ''
233245 while len (ret ) != n :
234246 if self ._fb_buf_i == len (self ._fb_buffers ):
235247 if self ._fb_feeding :
@@ -255,11 +267,12 @@ def _fb_read(self, n, write_bytes=None):
255267
256268 def _fb_unpack (self , execute = EX_CONSTRUCT , write_bytes = None ):
257269 typ = TYPE_IMMEDIATE
258- b = ord (self ._fb_read (1 , write_bytes ))
270+ c = self ._fb_read (1 , write_bytes )
271+ b = ord (c )
259272 if b & 0b10000000 == 0 :
260273 obj = b
261274 elif b & 0b11100000 == 0b11100000 :
262- obj = struct .unpack ("b" , chr ( b ) )[0 ]
275+ obj = struct .unpack ("b" , c )[0 ]
263276 elif b & 0b11100000 == 0b10100000 :
264277 n = b & 0b00011111
265278 obj = self ._fb_read (n , write_bytes )
@@ -374,6 +387,7 @@ def next(self):
374387 return ret
375388 except OutOfData :
376389 raise StopIteration
390+ __next__ = next
377391
378392 def skip (self , write_bytes = None ):
379393 self ._fb_unpack (EX_SKIP , write_bytes )
@@ -411,12 +425,12 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
411425 if nest_limit < 0 :
412426 raise PackValueError ("recursion limit exceeded" )
413427 if obj is None :
414- return self .buffer .write (chr ( 0xc0 ) )
428+ return self .buffer .write (b" \xc0 " )
415429 if isinstance (obj , bool ):
416430 if obj :
417- return self .buffer .write (chr ( 0xc3 ) )
418- return self .buffer .write (chr ( 0xc2 ) )
419- if isinstance (obj , int ) or isinstance ( obj , long ):
431+ return self .buffer .write (b" \xc3 " )
432+ return self .buffer .write (b" \xc2 " )
433+ if isinstance (obj , int_types ):
420434 if 0 <= obj < 0x80 :
421435 return self .buffer .write (struct .pack ("B" , obj ))
422436 if - 0x20 <= obj < 0 :
@@ -438,12 +452,12 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
438452 if - 0x8000000000000000 <= obj < - 0x80000000 :
439453 return self .buffer .write (struct .pack (">Bq" , 0xd3 , obj ))
440454 raise PackValueError ("Integer value out of range" )
441- if isinstance (obj , str ) or isinstance ( obj , unicode ):
442- if isinstance (obj , unicode ):
455+ if isinstance (obj , ( Unicode , bytes ) ):
456+ if isinstance (obj , Unicode ):
443457 obj = obj .encode (self .encoding , self .unicode_errors )
444458 n = len (obj )
445459 if n <= 0x1f :
446- self .buffer .write (chr ( 0xa0 + n ))
460+ self .buffer .write (struct . pack ( 'B' , 0xa0 + n ))
447461 return self .buffer .write (obj )
448462 if n <= 0xffff :
449463 self .buffer .write (struct .pack (">BH" , 0xda , n ))
@@ -463,7 +477,7 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
463477 self ._pack (obj [i ], nest_limit - 1 )
464478 return
465479 if isinstance (obj , dict ):
466- return self ._fb_pack_map_pairs (len (obj ), obj . iteritems ( ),
480+ return self ._fb_pack_map_pairs (len (obj ), dict_iteritems ( obj ),
467481 nest_limit - 1 )
468482 if self ._default is not None :
469483 return self ._pack (self ._default (obj ), nest_limit - 1 )
@@ -507,7 +521,7 @@ def pack_map_header(self, n):
507521
508522 def _fb_pack_array_header (self , n ):
509523 if n <= 0x0f :
510- return self .buffer .write (chr ( 0x90 + n ))
524+ return self .buffer .write (struct . pack ( 'B' , 0x90 + n ))
511525 if n <= 0xffff :
512526 return self .buffer .write (struct .pack (">BH" , 0xdc , n ))
513527 if n <= 0xffffffff :
@@ -516,7 +530,7 @@ def _fb_pack_array_header(self, n):
516530
517531 def _fb_pack_map_header (self , n ):
518532 if n <= 0x0f :
519- return self .buffer .write (chr ( 0x80 + n ))
533+ return self .buffer .write (struct . pack ( 'B' , 0x80 + n ))
520534 if n <= 0xffff :
521535 return self .buffer .write (struct .pack (">BH" , 0xde , n ))
522536 if n <= 0xffffffff :
0 commit comments