10
>>> m2 = memoryview(b2)
19
ctypedef struct Py_buffer # redeclared
21
int PyBuffer_FillInfo(Py_buffer *, object, void *, Py_ssize_t, bint, int) except -1
22
int PyObject_GetBuffer(object, Py_buffer *, int) except -1
23
void PyBuffer_Release(Py_buffer *)
25
cdef char global_buf[5]
26
global_buf[0:5] = [0, 1, 2, 3, 4]
28
cdef class UserBuffer1:
30
def __getbuffer__(self, Py_buffer* view, int flags):
31
PyBuffer_FillInfo(view, None, global_buf, 5, 1, flags)
33
cdef class UserBuffer2:
37
self.buf[0:5] = [5, 6, 7, 8, 9]
39
def __getbuffer__(self, Py_buffer* view, int flags):
40
print('UserBuffer2: getbuffer')
41
PyBuffer_FillInfo(view, self, self.buf, 5, 0, flags)
43
def __releasebuffer__(self, Py_buffer* view):
44
print('UserBuffer2: release')
48
ctypedef struct PyBuffer"Py_buffer":
53
cdef class _memoryview:
61
def __cinit__(self, obj):
62
cdef Py_buffer *view = <Py_buffer*>&self.view
63
PyObject_GetBuffer(obj, view, PyBUF_SIMPLE)
65
def __dealloc__(self):
66
cdef Py_buffer *view = <Py_buffer*>&self.view
67
PyBuffer_Release(view )
69
def __getbuffer__(self, Py_buffer *view, int flags):
70
PyBuffer_FillInfo(view, self,
71
self.view.buf, self.view.len,
72
self.view.readonly, flags)
74
cdef char *b = <char *> self.view.buf
75
return [b[i] for i in range(self.view.len)]