Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r90164:cb5fc958f45b Date: 2017-02-16 14:08 +0100 http://bitbucket.org/pypy/pypy/changeset/cb5fc958f45b/
Log: test and "fix" with ample comments about the memoryview() of a ctypes object diff --git a/pypy/module/_rawffi/buffer.py b/pypy/module/_rawffi/buffer.py --- a/pypy/module/_rawffi/buffer.py +++ b/pypy/module/_rawffi/buffer.py @@ -17,8 +17,18 @@ def getformat(self): return self.datainstance.fmt - def getitemsize(self): - return self.datainstance.itemsize + #XXX we keep the default of 1 for now. I *think* it does not make + # sense to give another answer here without also tweaking the + # 'shape' and 'strides'. At least it makes memoryobject.py think the + # buffer is not C-contiguous, which is nonsense (e.g. cast() are + # refused). Now, the memoryview we get from a ctypes object is the + # one that would correspond to an array of chars of the same + # size---which is wrong, because ctypes gives a more complicated + # result on CPython (at least 3.5), but at least it corresponds to + # the basics. (For example, CPython 3.5 gives a zero-dimensional + # memoryview if the ctypes type is not an array.) + #def getitemsize(self): + # return self.datainstance.itemsize def getitem(self, index): ll_buffer = self.datainstance.ll_buffer diff --git a/pypy/objspace/std/test/test_memoryobject.py b/pypy/objspace/std/test/test_memoryobject.py --- a/pypy/objspace/std/test/test_memoryobject.py +++ b/pypy/objspace/std/test/test_memoryobject.py @@ -8,7 +8,7 @@ from pypy.conftest import option class AppTestMemoryView: - spaceconfig = dict(usemodules=['array', 'sys']) + spaceconfig = dict(usemodules=['array', 'sys', '_rawffi']) def test_basic(self): v = memoryview(b"abc") @@ -280,6 +280,18 @@ assert m2.itemsize == m1.itemsize assert m2.shape == m1.shape + def test_cast_ctypes(self): + import _rawffi, sys + a = _rawffi.Array('i')(1) + a[0] = 0x01234567 + m = memoryview(a).cast('B') + if sys.byteorder == 'little': + expected = 0x67, 0x45, 0x23, 0x01 + else: + expected = 0x01, 0x23, 0x45, 0x67 + assert (m[0], m[1], m[2], m[3]) == expected + a.free() + class MockBuffer(Buffer): def __init__(self, space, w_arr, w_dim, w_fmt, \ w_itemsize, w_strides, w_shape): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit