summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBas Westerbaan <bas@westerbaan.name>2013-01-29 02:15:29 +0100
committerBas Westerbaan <bas@westerbaan.name>2013-01-29 02:15:29 +0100
commit94925acb124998aaf9438e7c8152fbfbb7d5d8a8 (patch)
treee9be7472450d7cbcf75586c6e2f102038cffb4f9
parentaf9c9ca2c9cae01cf603da90530b9ba396007e5b (diff)
downloadmsgpack-python-94925acb124998aaf9438e7c8152fbfbb7d5d8a8.tar.gz
fallback: do not use dynamic format strings for struct.(un)pack
Increases performance on PyPy.
-rw-r--r--msgpack/fallback.py12
1 files changed, 7 insertions, 5 deletions
diff --git a/msgpack/fallback.py b/msgpack/fallback.py
index d6fd533..fe2b1ac 100644
--- a/msgpack/fallback.py
+++ b/msgpack/fallback.py
@@ -258,7 +258,7 @@ class Unpacker(object):
obj = struct.unpack("b", chr(b))[0]
elif b & 0b11100000 == 0b10100000:
n = b & 0b00011111
- obj = struct.unpack("%ds" % n, self._fb_read(n, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
typ = TYPE_RAW
elif b & 0b11110000 == 0b10010000:
n = b & 0b00001111
@@ -294,11 +294,11 @@ class Unpacker(object):
obj = struct.unpack(">q", self._fb_read(8, write_bytes))[0]
elif b == 0xda:
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
- obj = struct.unpack("%ds" % n, self._fb_read(n, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
typ = TYPE_RAW
elif b == 0xdb:
n = struct.unpack(">I", self._fb_read(4, write_bytes))[0]
- obj = struct.unpack("%ds" % n, self._fb_read(n, write_bytes))[0]
+ obj = self._fb_read(n, write_bytes)
typ = TYPE_RAW
elif b == 0xdc:
n = struct.unpack(">H", self._fb_read(2, write_bytes))[0]
@@ -433,9 +433,11 @@ class Packer(object):
self.buffer.write(chr(0xa0 + n))
return self.buffer.write(obj)
if n <= 0xffff:
- return self.buffer.write(struct.pack(">BH%ds" % n,0xda, n, obj))
+ self.buffer.write(struct.pack(">BH", 0xda, n))
+ return self.buffer.write(obj)
if n <= 0xffffffff:
- return self.buffer.write(struct.pack(">BI%ds" % n,0xdb, n, obj))
+ self.buffer.write(struct.pack(">BI", 0xdb, n))
+ return self.buffer.write(obj)
raise PackValueError("String is too large")
if isinstance(obj, float):
if self.use_float: