[pypy-commit] cffi default: issue35: meh, Python 2.7 decided to drop complete support for 'buffer'

arigo noreply at buildbot.pypy.org
Sun Oct 28 16:18:39 CET 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r1014:14eff35bfad7
Date: 2012-10-28 16:18 +0100
http://bitbucket.org/cffi/cffi/changeset/14eff35bfad7/

Log:	issue35: meh, Python 2.7 decided to drop complete support for
	'buffer' object at the same time that 'memoryview' was added. Work
	around.

diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -4275,7 +4275,7 @@
         return NULL;
     }
     /*WRITE(cd->c_data, size)*/
-#if PY_MAJOR_VERSION < 3
+#if PY_MAJOR_VERSION < 3 && !defined(PyMemoryView_Check)   /* Python 2.6 */
     return PyBuffer_FromReadWriteMemory(cd->c_data, size);
 #else
     {
diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -9,7 +9,7 @@
     type_or_class = "type"
     mandatory_b_prefix = ''
     mandatory_u_prefix = 'u'
-    readbuf = str
+    readbuf = lambda buf: buf[:]
     bufchar = lambda x: x
     bytechr = chr
     class U(object):
@@ -1839,7 +1839,7 @@
     c[2] = b'-'
     buf[:2] = b'HI'
     assert string(c) == b'HI-there'
-    if sys.version_info < (3,) or sys.version_info >= (3, 3):
+    if sys.version_info < (2, 7) or sys.version_info >= (3, 3):
         assert buf[:4:2] == b'H-'
         if '__pypy__' not in sys.builtin_module_names:
             # XXX pypy doesn't support the following assignment so far
diff --git a/cffi/backend_ctypes.py b/cffi/backend_ctypes.py
--- a/cffi/backend_ctypes.py
+++ b/cffi/backend_ctypes.py
@@ -980,7 +980,7 @@
         return b._to_string(maxlen)
 
     def buffer(self, bptr, size=-1):
-        if sys.version_info >= (3,):
+        if sys.version_info >= (2, 7):
             # buf = bptr._as_ctype_ptr
             # return memoryview(buf.contents)
             if isinstance(bptr, CTypesGenericPtr):
diff --git a/testing/backend_tests.py b/testing/backend_tests.py
--- a/testing/backend_tests.py
+++ b/testing/backend_tests.py
@@ -1074,7 +1074,7 @@
             b = ffi.buffer(a)
         except NotImplementedError as e:
             py.test.skip(str(e))
-        if sys.version < '3':
+        if sys.version_info < (2, 7):
             assert type(b) is buffer
             content = str(b)
         else:
@@ -1098,7 +1098,7 @@
             b = ffi.buffer(a)
         except NotImplementedError as e:
             py.test.skip(str(e))
-        if sys.version < '3':
+        if sys.version_info < (2, 7):
             assert type(b) is buffer
             content = str(b)
         else:
@@ -1120,7 +1120,7 @@
             b = ffi.buffer(a, 1)
         except NotImplementedError as e:
             py.test.skip(str(e))
-        if sys.version < '3':
+        if sys.version_info < (2, 7):
             assert type(b) is buffer
             content = str(b)
         else:
@@ -1144,8 +1144,8 @@
             ffi.buffer(a1)
         except NotImplementedError as e:
             py.test.skip(str(e))
-        if sys.version < '3':
-            assert str(ffi.buffer(a1)) == str(ffi.buffer(a2, 4*10))
+        if sys.version_info < (3,):
+            assert ffi.buffer(a1)[:] == ffi.buffer(a2, 4*10)[:]
         else:
             assert ffi.buffer(a1).tobytes() == ffi.buffer(a2, 4*10).tobytes()
 
@@ -1169,6 +1169,24 @@
         f.close()
         os.unlink(filename)
 
+    def test_ffi_buffer_with_io(self):
+        ffi = FFI(backend=self.Backend())
+        import io, array
+        f = io.BytesIO()
+        a = ffi.new("int[]", list(range(1005)))
+        try:
+            ffi.buffer(a, 512)
+        except NotImplementedError as e:
+            py.test.skip(str(e))
+        f.write(ffi.buffer(a, 1000 * ffi.sizeof("int")))
+        f.seek(0)
+        assert f.read() == array.array('i', range(1000)).tostring()
+        f.seek(0)
+        b = ffi.new("int[]", 1005)
+        f.readinto(ffi.buffer(b, 1000 * ffi.sizeof("int")))
+        assert list(a)[:1000] + [0] * (len(a)-1000) == list(b)
+        f.close()
+
     def test_array_in_struct(self):
         ffi = FFI(backend=self.Backend())
         ffi.cdef("struct foo_s { int len; short data[5]; };")


More information about the pypy-commit mailing list