Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r858:3dcb561d1819
Date: 2012-08-14 14:15 +0200
http://bitbucket.org/cffi/cffi/changeset/3dcb561d1819/

Log:    Pass or skip the buffer tests on 3.2 too. The buffer interface is
        *still* a complete mess on Python 3.

diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -4033,7 +4033,7 @@
     {
       Py_buffer view;
       if (PyBuffer_FillInfo(&view, NULL, cd->c_data, size,
-                            /*readonly=*/0, PyBUF_WRITABLE) < 0)
+                            /*readonly=*/0, PyBUF_CONTIG | PyBUF_FORMAT) < 0)
         return NULL;
       return PyMemoryView_FromBuffer(&view);
     }
diff --git a/cffi/backend_ctypes.py b/cffi/backend_ctypes.py
--- a/cffi/backend_ctypes.py
+++ b/cffi/backend_ctypes.py
@@ -965,10 +965,14 @@
                 _fields_ = [('stupid', type(val))]
             ptr = ctypes.cast(buf, ctypes.POINTER(Hack))
             view = memoryview(ptr.contents)
+            try:
+                view = view.cast('B')
+            except AttributeError:
+                raise NotImplementedError("buffer() with ctypes backend "
+                                          "in Python < 3.3")
             if size >= 0:
-                return view.cast('B')[:size]
-            else:
-                return view.cast('B')
+                view = view[:size]
+            return view
 
         # haaaaaaaaaaaack
         if '__pypy__' in sys.builtin_module_names:
diff --git a/testing/backend_tests.py b/testing/backend_tests.py
--- a/testing/backend_tests.py
+++ b/testing/backend_tests.py
@@ -9,6 +9,11 @@
 SIZE_OF_PTR   = ctypes.sizeof(ctypes.c_void_p)
 SIZE_OF_WCHAR = ctypes.sizeof(ctypes.c_wchar)
 
+if sys.version_info < (3, 3):
+    bufitem = lambda x: x
+else:
+    bufitem = ord
+
 
 class BackendTests:
 
@@ -1076,10 +1081,12 @@
         assert len(content) == 2
         if sys.byteorder == 'little':
             assert content == b'\x64\x00'
-            b[0] = b'\x65'[0]
+            assert b[0] == bufitem(b'\x64')
+            b[0] = bufitem(b'\x65')
         else:
             assert content == b'\x00\x64'
-            b[1] = b'\x65'[0]
+            assert b[1] == bufitem(b'\x64')
+            b[1] = bufitem(b'\x65')
         assert a[0] == 101
 
     def test_ffi_buffer_array(self):
@@ -1097,10 +1104,10 @@
             content = b.tobytes()
         if sys.byteorder == 'little':
             assert content.startswith(b'\x64\x00\x00\x00\x65\x00\x00\x00')
-            b[4] = b'\x45'[0]
+            b[4] = bufitem(b'\x45')
         else:
             assert content.startswith('\x00\x00\x00\x64\x00\x00\x00\x65')
-            b[7] = b'\x45'[0]
+            b[7] = bufitem(b'\x45')
         assert len(content) == 4 * 10
         assert a[1] == 0x45
 
@@ -1120,11 +1127,11 @@
         assert len(content) == 1
         if sys.byteorder == 'little':
             assert content == b'\x43'
-            b[0] = b'\x62'[0]
+            b[0] = bufitem(b'\x62')
             assert a[0] == 0x4262
         else:
             assert content == b'\x42'
-            b[0] = b'\x63'[0]
+            b[0] = bufitem(b'\x63')
             assert a[0] == 0x6343
 
     def test_ffi_buffer_array_size(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to