sip - returning a MemoryView in %ConvertFromTypeCode

Phil Thompson phil at riverbankcomputing.com
Mon Dec 27 11:31:00 GMT 2021


On 26/12/2021 21:47, Scott Talbert wrote:
> Hi,
> 
> I'm trying to fix a bug in wxPython where a MemoryView is returned in
> a %ConvertFromTypeCode.
> 
> The code is this:
> PyObject* i_wxPyMakeBuffer(void* ptr, Py_ssize_t len, bool 
> readOnly=false) {
>     wxPyThreadBlocker blocker;
>     if (ptr && len) {
>         Py_buffer view;
>         int flags = PyBUF_FORMAT|PyBUF_ND;
>         if (!readOnly)
>             flags |= PyBUF_WRITABLE;
>         PyBuffer_FillInfo(&view, NULL, ptr, len, readOnly ? 1:0, 
> flags);
>         return PyMemoryView_FromBuffer(&view);
>     } else {
>         Py_INCREF(Py_None); return Py_None;
>     }
> 
> %ConvertFromTypeCode
>     return wxPyMakeBuffer(sipCpp->GetData(), sipCpp->GetDataLen());
> %End
> 
> This "works" but the problem is that after %ConvertFromTypeCode runs,
> the C++ object goes away, and since the MemoryView still references
> data from the C++ object, this leads to accessing memory that has been
> freed.  Is there a recommended way to handle such a situation with
> sip?  Ie, keep the C++ object around after a %ConvertFromTypeCode?  Of
> course, I could copy the all the data in %ConvertFromTypeCode, but
> that's the thing we're trying to avoid by using the MemoryView.

I don't see how SIP generated code can help as it's really a limitation 
of MemoryView. It needs to support the concept of the MemoryView owning 
the underlying data and being able to provide a destructor similar to a 
Capsule.

Phil


More information about the PyQt mailing list