summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--c/_cffi_backend.c2
-rw-r--r--cffi/backend_ctypes.py10
-rw-r--r--testing/backend_tests.py19
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):