On 2019-10-07 08:04, Geoff Bache wrote:
It's possible. Our embedding code is fairly simple and we've tried to encapsulate all the DECREFing in resource objects, i.e. that do DECREF in their destructor when they go out of scope. We hoped this would minimise this sort of problem. The C++ calling code essentially tries to call progwrapper.prog with a dictionary as arguments, and looks like

GilStateHolder pyStateHolder;
PyRefHolder module(PyImport_ImportModule("progwrapper"));

  if (module._ref)
  {
    PyXRefHolder func(PyObject_GetAttrString(module._ref, "prog"));
    PyXRefHolder pyArgs(PyTuple_New(1));
    PyXRefHolder pyDict(convertDictForPython(dictIn));
    PyTuple_SetItem(pyArgs._ref, 0, pyDict._ref);

|Do you DECREF pyDict._ref later on? I ask because PyTuple_SetItem steals a reference.|

|Many other functions that "store" an object, such as PyList_Append, INCREF to retain the stored object, but PyTuple_SetItem doesn't.|

||

    PyRefHolder pyRet(PyObject_CallObject(func._ref, pyArgs._ref));

    if (pyRet._ref != NULL)
    {
      addPythonValuesToDict(pyRet._ref, theDict);
      ...

where GilStateHolder, PyRefHolder etc are such resource objects as described above, wrapping round the PyObject pointers etc.

[snip]

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to