On Tue, 23 Nov 2010 17:12:01 +0100, Jens Thoms Toerring <[email protected]>
wrote:
> Hi Phil,
> 
> On Tue, Nov 23, 2010 at 02:42:59PM +0000, Phil Thompson wrote:
>> Not every C++ class can be wrapped. SIP often has to create temporary
>> instances which obviously requires support from the underlying C++.
> 
> Thanks for the quick reply! It's a bit unlucky in my case since
> creating public constructors with no arguments or a single int
> argument simply doesn't make sense:-( And can you tell me why
> in some cases a constructor with no argument and in others one
> with an int are used? Without that information I wouldn't even
> know which constructors I have to define (if I find a way to do
> that).

Sorry I don't understand the question.

> BTW, looking at the sipVH_PyFoo_0() function it looks a bit as
> if an instance of A is only created to obtain enough memory for
> an object returned by sipParseResult(). So I'm wondering if the
> constructor call couldn't be avoided when generating the function
> instead in this way:
> 
> A sipVH_PyFoo_0(sip_gilstate_t sipGILState,PyObject *sipMethod)
> {
>       std::auto_ptr<char> sipRes(new char[sizeof(A)]);
>     PyObject *resObj = sipCallMethod(0,sipMethod,"");
> 
>     if (!resObj || sipParseResult(0,sipMethod,resObj,"H5",sipType_A,
>                                     reinterpret_cast<A*>(sipRes.get())) < 0)
>         PyErr_Print();
> 
>     Py_XDECREF(resObj);
>     Py_DECREF(sipMethod);
> 
>     SIP_RELEASE_GIL(sipGILState)
> 
>       return *reinterpret_cast<A*>(sipRes.get());
> }
> 
> As far as I know new() should return memory properly aligned for
> arbitrary objects and using a std::auto_ptr should take care of
> not creating a memory leak . But then I'm not 100% sure if retur-
> ning the content of an auto_ptr is ok, so an alternative might
> be:
> 
> A sipVH_PyFoo_0(sip_gilstate_t sipGILState,PyObject *sipMethod)
> {
>       char *tmp = sipRes(new char[sizeof(A)]);
>     PyObject *resObj = sipCallMethod(0,sipMethod,"");
> 
>     if (!resObj || sipParseResult(0,sipMethod,resObj,"H5",sipType_A,
>                                     reinterpret_cast<A*>(tmp)) < 0)
>         PyErr_Print();
> 
>     Py_XDECREF(resObj);
>     Py_DECREF(sipMethod);
> 
>     SIP_RELEASE_GIL(sipGILState)
> 
>     A sipRes = *reinterpret_cast<A*>(tmp);
>       delete [] tmp;
>       return sipRes;
> }
> 
> But perhaps that's a stupid idea (especially since I have no
> good knowledge of the innards of the sipParseResult() function).
> It's just an idea I came upon while pondering what's going on;-)

That would probably work, but it relies on there being a public copy ctor
for A. It's a strange API that has a public copy ctor but no other public
ctor.

Phil
_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to