Two issues with sip.array

Ognyan Moore ognyan.moore at gmail.com
Fri Feb 24 19:26:48 GMT 2023


Appreciate the update Phil, thanks!

On Fri, Feb 24, 2023 at 07:19 Phil Thompson <phil at riverbankcomputing.com>
wrote:

> The fixes will be in the next snapshot.
>
> Thanks,
> Phil
>
> On 07/02/2023 16:04, Ognyan Moore wrote:
> > Hi Phil,
> >
> > We have identified two issues with sip.array and I think we identified
> > their respective fixes too.
> >
> > The first has to do with the buffer protocol, we have a work-around but
> > here is some code to demonstrate the issue:
> >
> > from PyQt6 import QtCore, sip
> > import numpy as np
> >
> >
> > LEN = 5
> > sa = sip.array(QtCore.QLineF, LEN)   # LEN * 4 doubles
> > assert len(sa) == LEN
> >
> >
> > # following fails due to wrong size
> > # memory = np.frombuffer(sa, dtype=np.float64)
> > # ValueError: buffer size must be a multiple of element size
> >
> >
> > vp = sip.voidptr(sa)
> > print(f'expecting {LEN*4*8}, got {vp.getsize()}')
> >
> >
> > # the following is our workaround
> > vp.setsize(len(sa)*4*8)
> > memory = np.frombuffer(vp, dtype=np.float64)
> > assert len(memory) == LEN * 4
> >
> > The bug is in sip_array.c
> > # static int sipArray_getbuffer(PyObject self, Py_bufferview, int
> > flags)
> > #    view->len = array->len;
> > # should be
> > #    view->len = array->len * array->stride;
> > # https://docs.python.org/3/c-api/buffer.html#c.PyObject_GetBuffer
> >
> > The second issue is that slicing sip.array does not work:
> >
> > from PyQt6 import QtCore, sip
> >
> >
> > sa1 = sip.array(QtCore.QLineF, 10)
> > assert len(sa1) == 10
> > sa2 = sa1[2:8]
> > assert len(sa2) == 6
> >
> >
> > vp1 = sip.voidptr(sa1)
> > assert int(vp1) != 0
> > vp2 = sip.voidptr(sa2)
> > print(hex(int(vp2)))    # NULL pointer
> >
> > The behavior we would expect is that slicing would yield a non-owning
> > memory view.
> >
> > The bug is also in sip_array.c
> > # static PyObject sipArray_subscript(PyObjectself, PyObject *key)
> > #   element(array->data, start)
> > # should be
> > #   element(array, start)
> >
> > Thanks Phil!
> > Ogi
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20230224/c74d4a65/attachment.htm>


More information about the PyQt mailing list