[pypy-svn] r52309 - in pypy/branch/buffer/pypy/module/struct: . test
arigo at codespeak.net
arigo at codespeak.net
Sat Mar 8 19:35:29 CET 2008
Author: arigo
Date: Sat Mar 8 19:35:28 2008
New Revision: 52309
Modified:
pypy/branch/buffer/pypy/module/struct/__init__.py
pypy/branch/buffer/pypy/module/struct/app_struct.py
pypy/branch/buffer/pypy/module/struct/test/test_struct.py
Log:
Some inefficient implementations of struct.pack_into()
and struct.unpack_from().
Modified: pypy/branch/buffer/pypy/module/struct/__init__.py
==============================================================================
--- pypy/branch/buffer/pypy/module/struct/__init__.py (original)
+++ pypy/branch/buffer/pypy/module/struct/__init__.py Sat Mar 8 19:35:28 2008
@@ -53,4 +53,6 @@
appleveldefs = {
'error': 'app_struct.error',
+ 'pack_into': 'app_struct.pack_into',
+ 'unpack_from': 'app_struct.unpack_from',
}
Modified: pypy/branch/buffer/pypy/module/struct/app_struct.py
==============================================================================
--- pypy/branch/buffer/pypy/module/struct/app_struct.py (original)
+++ pypy/branch/buffer/pypy/module/struct/app_struct.py Sat Mar 8 19:35:28 2008
@@ -4,7 +4,22 @@
NOT_RPYTHON
"""
+import struct
class error(Exception):
"""Exception raised on various occasions; argument is a string
describing what is wrong."""
+
+# XXX inefficient
+def pack_into(fmt, buf, offset, *args):
+ data = struct.pack(fmt, *args)
+ buffer(buf)[offset:offset+len(data)] = data
+
+# XXX inefficient
+def unpack_from(fmt, buf, offset=0):
+ size = struct.calcsize(fmt)
+ data = buffer(buf)[offset:offset+size]
+ if len(data) != size:
+ raise error("unpack_from requires a buffer of at least %d bytes"
+ % (size,))
+ return struct.unpack(fmt, data)
Modified: pypy/branch/buffer/pypy/module/struct/test/test_struct.py
==============================================================================
--- pypy/branch/buffer/pypy/module/struct/test/test_struct.py (original)
+++ pypy/branch/buffer/pypy/module/struct/test/test_struct.py Sat Mar 8 19:35:28 2008
@@ -333,3 +333,36 @@
data = self.struct.pack("uuu", u'X', u'Y', u'Z')
assert data == str(buffer(u'XYZ'))
assert self.struct.unpack("uuu", data) == (u'X', u'Y', u'Z')
+
+
+class AppTestStructBuffer(object):
+
+ def setup_class(cls):
+ """
+ Create a space with the struct and __pypy__ modules.
+ """
+ cls.space = gettestobjspace(usemodules=['struct', '__pypy__'])
+ cls.w_struct = cls.space.appexec([], """():
+ import struct
+ return struct
+ """)
+ cls.w_bytebuffer = cls.space.appexec([], """():
+ import __pypy__
+ return __pypy__.bytebuffer
+ """)
+
+ def test_pack_into(self):
+ b = self.bytebuffer(19)
+ sz = self.struct.calcsize("ii")
+ self.struct.pack_into("ii", b, 2, 17, 42)
+ assert b[:] == ('\x00' * 2 +
+ self.struct.pack("ii", 17, 42) +
+ '\x00' * (19-sz-2))
+
+ def test_unpack_from(self):
+ b = self.bytebuffer(19)
+ sz = self.struct.calcsize("ii")
+ b[2:2+sz] = self.struct.pack("ii", 17, 42)
+ assert self.struct.unpack_from("ii", b, 2) == (17, 42)
+ b[:sz] = self.struct.pack("ii", 18, 43)
+ assert self.struct.unpack_from("ii", b) == (18, 43)
More information about the Pypy-commit
mailing list