diff options
Diffstat (limited to 'tests/buffers/userbuffer.pyx')
-rw-r--r-- | tests/buffers/userbuffer.pyx | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/buffers/userbuffer.pyx b/tests/buffers/userbuffer.pyx new file mode 100644 index 000000000..b9c871970 --- /dev/null +++ b/tests/buffers/userbuffer.pyx @@ -0,0 +1,85 @@ +import sys + +__doc__ = u"" + +if sys.version_info[:2] == (2, 6): + __doc__ += u""" +>>> memoryview = _memoryview +""" + +__doc__ += u""" +>>> b1 = UserBuffer1() +>>> m1 = memoryview(b1) +>>> m1.tolist() +[0, 1, 2, 3, 4] +>>> del m1, b1 +""" + +__doc__ += u""" +>>> b2 = UserBuffer2() +>>> m2 = memoryview(b2) +UserBuffer2: getbuffer +>>> m2.tolist() +[5, 6, 7, 8, 9] +>>> del m2, b2 +UserBuffer2: release +""" + +cdef extern from *: + ctypedef struct Py_buffer # redeclared + enum: PyBUF_SIMPLE + int PyBuffer_FillInfo(Py_buffer *, object, void *, Py_ssize_t, bint, int) except -1 + int PyObject_GetBuffer(object, Py_buffer *, int) except -1 + void PyBuffer_Release(Py_buffer *) + +cdef char global_buf[5] +global_buf[0:5] = [0, 1, 2, 3, 4] + +cdef class UserBuffer1: + + def __getbuffer__(self, Py_buffer* view, int flags): + PyBuffer_FillInfo(view, None, global_buf, 5, 1, flags) + +cdef class UserBuffer2: + cdef char buf[5] + + def __cinit__(self): + self.buf[0:5] = [5, 6, 7, 8, 9] + + def __getbuffer__(self, Py_buffer* view, int flags): + print('UserBuffer2: getbuffer') + PyBuffer_FillInfo(view, self, self.buf, 5, 0, flags) + + def __releasebuffer__(self, Py_buffer* view): + print('UserBuffer2: release') + + +cdef extern from *: + ctypedef struct PyBuffer"Py_buffer": + void *buf + Py_ssize_t len + bint readonly + +cdef class _memoryview: + + """ + Memory + """ + + cdef PyBuffer view + + def __cinit__(self, obj): + cdef Py_buffer *view = <Py_buffer*>&self.view + PyObject_GetBuffer(obj, view, PyBUF_SIMPLE) + + def __dealloc__(self): + cdef Py_buffer *view = <Py_buffer*>&self.view + PyBuffer_Release(view ) + + def __getbuffer__(self, Py_buffer *view, int flags): + PyBuffer_FillInfo(view, self, + self.view.buf, self.view.len, + self.view.readonly, flags) + def tolist(self): + cdef char *b = <char *> self.view.buf + return [b[i] for i in range(self.view.len)] |