[pypy-commit] pypy faster-rstruct-2: add a passing test to check that we don't take the fast path for unaligned access

antocuni pypy.commits at gmail.com
Thu May 18 11:13:37 EDT 2017


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: faster-rstruct-2
Changeset: r91333:23b951353efe
Date: 2017-05-18 16:19 +0200
http://bitbucket.org/pypy/pypy/changeset/23b951353efe/

Log:	add a passing test to check that we don't take the fast path for
	unaligned access

diff --git a/rpython/rlib/rstruct/test/test_pack.py b/rpython/rlib/rstruct/test/test_pack.py
--- a/rpython/rlib/rstruct/test/test_pack.py
+++ b/rpython/rlib/rstruct/test/test_pack.py
@@ -7,21 +7,15 @@
 
 class FakeFormatIter(object):
 
-    def __init__(self, bigendian, size, value):
-        from rpython.rlib.rstring import StringBuilder
+    def __init__(self, bigendian, wbuf, value):
         self.value = value
         self.bigendian = bigendian
-        self.wbuf = MutableStringBuffer(size)
+        self.wbuf = wbuf
         self.pos = 0
 
     def advance(self, count):
         self.pos += count
 
-    def finish(self):
-        # check that we called advance() the right number of times
-        assert self.pos == self.wbuf.getlength()
-        return self.wbuf.finish()
-
     def _accept_arg(self):
         return self.value
 
@@ -58,16 +52,27 @@
 
     def mypack(self, fmt, value):
         size = struct.calcsize(fmt)
-        fake_fmtiter = FakeFormatIter(self.bigendian, size, value)
+        wbuf = MutableStringBuffer(size)
+        fake_fmtiter = self.mypack_into(fmt, wbuf, value)
+        # check that we called advance() the right number of times
+        assert fake_fmtiter.pos == wbuf.getlength()
+        return wbuf.finish()
+
+    def mypack_into(self, fmt, wbuf, value, advance=None):
+        fake_fmtiter = FakeFormatIter(self.bigendian, wbuf, value)
+        if advance:
+            fake_fmtiter.advance(advance)
         attrs = self.fmttable[fmt]
         pack = attrs['pack']
         pack(fake_fmtiter)
-        return fake_fmtiter.finish()
+        return fake_fmtiter
 
     def mypack_fn(self, func, size, arg, value):
-        fmtiter = FakeFormatIter(self.bigendian, size, value)
-        func(fmtiter, arg)
-        return fmtiter.finish()
+        wbuf = MutableStringBuffer(size)
+        fake_fmtiter = FakeFormatIter(self.bigendian, wbuf, value)
+        func(fake_fmtiter, arg)
+        assert fake_fmtiter.pos == wbuf.getlength()
+        return wbuf.finish()
 
     def check(self, fmt, value):
         expected = struct.pack(self.fmt_prefix+fmt, value)
@@ -193,3 +198,20 @@
     fmt_prefix = '@'
     fmttable = nativefmttable.native_fmttable
 
+
+class TestUnaligned(PackSupport):
+    ALLOW_FASTPATH = False
+    bigendian = nativefmttable.native_is_bigendian
+    fmttable = nativefmttable.native_fmttable
+
+    def test_unaligned(self):
+        # to force a non-aligned 'i'
+        expected = struct.pack('=BBi', 0xAB, 0xCD, 0x1234)
+        #
+        wbuf = MutableStringBuffer(len(expected))
+        wbuf.setitem(0, chr(0xAB))
+        wbuf.setitem(1, chr(0xCD))
+        fake_fmtiter = self.mypack_into('i', wbuf, 0x1234, advance=2)
+        assert fake_fmtiter.pos == wbuf.getlength()
+        got = wbuf.finish()
+        assert got == expected


More information about the pypy-commit mailing list