Skip to content

Commit 8d6a387

Browse files
committed
fallback: Support Python 3.
1 parent cbabeeb commit 8d6a387

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

msgpack/fallback.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,28 @@
44
import array
55
import 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+
722
if 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()
2338
else:
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

3042
from 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

Comments
 (0)