[PyQt] Custom exception when transferring "owned" object

Nyall Dawson nyall.dawson at gmail.com
Mon Nov 4 04:42:43 GMT 2019


On Fri, 29 Mar 2019 at 19:59, Phil Thompson <phil at riverbankcomputing.com> wrote:
>
> On 29 Mar 2019, at 6:32 am, Nyall Dawson <nyall.dawson at gmail.com> wrote:
> >
> > Hi list,
> >
> > I'm trying to find a way to raise a custom exception if someone
> > attempts to call a method which takes ownership with an object which
> > is already owned elsewhere (instead of crashing at some future
> > stage!).
>
> sipConvertFromType() returns a new reference which you aren't dealing with properly.
>
> You don't need the first call to sipConvertFromType(). Use /GetWrapper/ instead.
>
> sipIsPyOwned() is an undocumented internal function and may be removed at any time.
>

I noticed that there's now sipIsOwnedByPython in the public API. My
updated code looks like this:

    if ( !sipIsOwnedByPython( ( sipSimpleWrapper * )a0Wrapper ) )
    {
      PyErr_SetString( sipException_OwnershipException, "Geometry is
already owned by another c++ object. Use .clone() to add a deep copy
of the geometry to this multipoint." );
      sipIsErr = 1;
    }
    else
    {
      bool res = sipCpp->addGeometry( a0 );
      if ( res )
      {
        PyObject *owner = sipConvertFromType( sipCpp,
sipType_QgsAbstractGeometry, NULL );
        sipTransferTo( a0Wrapper,  owner );
        Py_DECREF( owner );
      }
      return PyBool_FromLong( res );

Does this approach look reasonable to you? Is it correctly using the
new sipIsOwnedByPython call?

Kind regards,
Nyall


More information about the PyQt mailing list