On 15.08.2012, 11:05:42 Phil Thompson wrote: > On Tue, 14 Aug 2012 23:47:51 +0200, mathias.b...@gmx.de wrote: >> Thanks for the answer. However, it appears I've not made myself >> clear enough. >> I don't want the C++ wrapper to be owned by Python; surely, I >> can achieve that with "sipTransferTo". But nothing is done about the >> Python part. When I delete the wrapper in C++, the Python part it wraps >> stays alive, because its reference count is not touched. (No parent!) >> I have to manually, explicitely decrease the reference count to get >> rid of it. I'm not complaining. I get this Python object from a Python >> function, so I have to take care of it. >> >> However, the sip module already contains some code that essentially >> already would do what I want: >> >> ======================== siplib.c =================================== >> void sip_api_common_dtor(sipSimpleWrapper *sipSelf) >> { >> if (sipSelf != NULL && sipInterpreter != NULL) >> { >> PyObject *xtype, *xvalue, *xtb; >> >> SIP_BLOCK_THREADS >> >> /* We may be tidying up after an exception so preserve it. */ >> PyErr_Fetch(&xtype, &xvalue, &xtb); >> callPyDtor(sipSelf); >> PyErr_Restore(xtype, xvalue, xtb); >> >> sipOMRemoveObject(&cppPyMap, sipSelf); >> >> /* This no longer points to anything useful. */ >> clear_access_func(sipSelf); >> >> /* >> * If C/C++ has a reference (and therefore no parent) then > remove >> it. >> * Otherwise remove the object from any parent. >> */ >> if (sipCppHasRef(sipSelf)) >> { >> sipResetCppHasRef(sipSelf); >> Py_DECREF(sipSelf); >> } >> else if (PyObject_TypeCheck((PyObject *)sipSelf, (PyTypeObject >> *)&sipWrapper_Type)) >> removeFromParent((sipWrapper *)sipSelf); >> >> SIP_UNBLOCK_THREADS >> } >> } >> ===================================================================== >> >> What about: >> >> if (sipCppHasRef(sipSelf)) >> { >> sipResetCppHasRef(sipSelf); >> Py_DECREF(sipSelf); >> } >> >> Is there an official way for my wrapper to have the "SIP_CPP_HAS_REF" > flag >> set? >> It would then automatically dispose its Python counterpart.
> I could change sipTransferTo() to do this if the owner was Py_None. At the > moment this is undocumented behaviour. Would this be sufficient? I believe so. Best Regards, Mathias Born _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt