[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