[PyQt] Custom exception when transferring "owned" object

Nyall Dawson nyall.dawson at gmail.com
Fri Mar 29 06:32:07 GMT 2019


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!).

Here's what I've got so far:

.h:

bool addGeometry( QgsAbstractGeometry *g );

.sip:

%MethodCode
    PyObject *obj = sipConvertFromType( a0, sipType_QgsAbstractGeometry, NULL );
    if ( !sipIsPyOwned( ( sipSimpleWrapper * )obj ) )
    {
      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;
      Py_DECREF( obj );
    }
    else
    {
      bool res = sipCpp->addGeometry( a0 );
      if ( res )
      {
        PyObject *owner = sipConvertFromType( sipCpp,
sipType_QgsAbstractGeometry, NULL );
        sipTransferTo( obj,  owner );
      }
      return PyBool_FromLong( res );
    }
%End

It works ok about 50% of the time, the other 50% it crashes. I suspect
my methodcode isn't correct transferring ownership and the argument
c++ object is getting deleted when its Python wrapper goes out of
scope.

Can anyone see what I'm missing here?

Nyall


More information about the PyQt mailing list