[PyQt] sip: add new annotation for specifying ownership of results of virtual methods

Mathias.Born at gmx.de Mathias.Born at gmx.de
Mon Sep 3 21:27:41 BST 2012


Hi Phil,

I've come across a case which I think deserves its own function annotation.
This is the proplem:

I'm embedding Python code into a C++ app. There are two wrapped classes:

class Netlister
{
      virtual ~Netlister();
      ...
};

and

class Project
{
      virtual ~Project();
      ...
      virtual NetLister* netLister(const std::string& netListText) const;
};

In Python, I have ("ltse_app" is the C++ app exposed as module)


class LTspiceNetLister(ltse_app.NetLister):
      ...

and

class Project(ltse_app.Project):
      ...
      def netLister(self, netListText):
            return LTspiceNetLister()


First, I call a Python function which gives me an instance of the Python
class "Project". Then (in C++, using its wrapper), I call its method "netLister",
which returns an instance of "LTspiceNetLister". The goal is to use
this instance on the C++ side via its wrapper. Thus, ownership should be with C++.

But there is no corresponding annotation for the sip file. I have to provide
a "%VirtualCatcherCode":

virtual NetLister* netLister(const std::string& netListText /NoCopy/) const;
%VirtualCatcherCode
        PyObject *resObj = sipCallMethod(0, sipMethod, "D", const_cast<std::string*>(&a0), sipType_std_string, NULL);
        sipIsErr = !resObj || sipParseResult(0, sipMethod, resObj, "H0", sipType_NetLister, &sipRes) < 0;
        if (!sipIsErr) sipTransferTo(resObj, Py_None);
        Py_XDECREF(resObj);
%End

Note how I use "sipTransferTo(resObj, Py_None);" to bind the Python object to the C++ instance.
I'm basically asking for something like the "Factory" annotation which does just that.

"Factory" tells sip that a wrapped C++ function creates a new object that will be owned by the
Python side. I'd like to have another annotation which tells sip that the Python implementation
of a class method creates a new object that will be owned by the C++ side.

Best Regards,
Mathias Born






More information about the PyQt mailing list