diff options
-rw-r--r-- | c/_cffi_backend.c | 2 | ||||
-rw-r--r-- | cffi/backend_ctypes.py | 10 | ||||
-rw-r--r-- | testing/backend_tests.py | 19 |
3 files changed, 21 insertions, 10 deletions
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c index 31a0917..6693dd8 100644 --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -4033,7 +4033,7 @@ static PyObject *b_buffer(PyObject *self, PyObject *args) { 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 index 2310c11..db971e2 100644 --- a/cffi/backend_ctypes.py +++ b/cffi/backend_ctypes.py @@ -965,10 +965,14 @@ class CTypesBackend(object): _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 index 4b4a789..f343f83 100644 --- a/testing/backend_tests.py +++ b/testing/backend_tests.py @@ -9,6 +9,11 @@ SIZE_OF_SHORT = ctypes.sizeof(ctypes.c_short) 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 @@ class BackendTests: 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 @@ class BackendTests: 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 @@ class BackendTests: 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): |