<div dir="auto">Appreciate the update Phil, thanks!</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 24, 2023 at 07:19 Phil Thompson <<a href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)">The fixes will be in the next snapshot.<br>
<br>
Thanks,<br>
Phil<br>
<br>
On 07/02/2023 16:04, Ognyan Moore wrote:<br>
> Hi Phil,<br>
> <br>
> We have identified two issues with sip.array and I think we identified<br>
> their respective fixes too.<br>
> <br>
> The first has to do with the buffer protocol, we have a work-around but<br>
> here is some code to demonstrate the issue:<br>
> <br>
> from PyQt6 import QtCore, sip<br>
> import numpy as np<br>
> <br>
> <br>
> LEN = 5<br>
> sa = sip.array(QtCore.QLineF, LEN)   # LEN * 4 doubles<br>
> assert len(sa) == LEN<br>
> <br>
> <br>
> # following fails due to wrong size<br>
> # memory = np.frombuffer(sa, dtype=np.float64)<br>
> # ValueError: buffer size must be a multiple of element size<br>
> <br>
> <br>
> vp = sip.voidptr(sa)<br>
> print(f'expecting {LEN*4*8}, got {vp.getsize()}')<br>
> <br>
> <br>
> # the following is our workaround<br>
> vp.setsize(len(sa)*4*8)<br>
> memory = np.frombuffer(vp, dtype=np.float64)<br>
> assert len(memory) == LEN * 4<br>
> <br>
> The bug is in sip_array.c<br>
> # static int sipArray_getbuffer(PyObject self, Py_bufferview, int <br>
> flags)<br>
> #    view->len = array->len;<br>
> # should be<br>
> #    view->len = array->len * array->stride;<br>
> # <a href="https://docs.python.org/3/c-api/buffer.html#c.PyObject_GetBuffer" rel="noreferrer" target="_blank">https://docs.python.org/3/c-api/buffer.html#c.PyObject_GetBuffer</a><br>
> <br>
> The second issue is that slicing sip.array does not work:<br>
> <br>
> from PyQt6 import QtCore, sip<br>
> <br>
> <br>
> sa1 = sip.array(QtCore.QLineF, 10)<br>
> assert len(sa1) == 10<br>
> sa2 = sa1[2:8]<br>
> assert len(sa2) == 6<br>
> <br>
> <br>
> vp1 = sip.voidptr(sa1)<br>
> assert int(vp1) != 0<br>
> vp2 = sip.voidptr(sa2)<br>
> print(hex(int(vp2)))    # NULL pointer<br>
> <br>
> The behavior we would expect is that slicing would yield a non-owning<br>
> memory view.<br>
> <br>
> The bug is also in sip_array.c<br>
> # static PyObject sipArray_subscript(PyObjectself, PyObject *key)<br>
> #   element(array->data, start)<br>
> # should be<br>
> #   element(array, start)<br>
> <br>
> Thanks Phil!<br>
> Ogi<br>
</blockquote></div></div>