diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-02-04 20:05:10 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-02-10 08:42:22 -0300 |
commit | 54b41b60e7c1b5bf2597cf1cc3ca4da428f2437e (patch) | |
tree | 36c5886644ec57b5126081f088c94500504ef35f /cppgenerator.cpp | |
parent | acdd27d2497bbc769025e3efe683f67378bd907e (diff) |
Fixes reference counting for public class' variables member setters.
When setting a class' public variable that is a pointer to a C++
object the Python wrapper for that class should have its reference
count increased, and the old referred pointer decreased.
Diffstat (limited to 'cppgenerator.cpp')
-rw-r--r-- | cppgenerator.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index c800ac2d3..bf64e5831 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -1936,11 +1936,38 @@ void CppGenerator::writeSetterFunction(QTextStream& s, const AbstractMetaField* s << metaField->name() << "', '" << metaField->type()->name() << "' or convertible type expected\");" << endl; s << INDENT << "return -1;" << endl; } - s << INDENT << '}' << endl; + s << INDENT << '}' << endl << endl; + + QString fieldStr = QString("%1->%2").arg(cpythonWrapperCPtr(metaField->enclosingClass(), "self")).arg(metaField->name()); + + bool pythonWrapperRefCounting = metaField->type()->typeEntry()->isObject() || metaField->type()->isValuePointer(); + + if (pythonWrapperRefCounting) { + s << INDENT << "Py_INCREF(value);" << endl; + s << INDENT << "PyObject* oldvalue;" << endl; + + s << INDENT << "if (" << fieldStr << ")" << endl; + { + Indentation indent(INDENT); + s << INDENT << "oldvalue = BindingManager::instance().retrieveWrapper("; + s << fieldStr << ");" << endl; + } + s << INDENT << "else" << endl; + { + Indentation indent(INDENT); + s << INDENT << "oldvalue = Py_None;" << endl; + } + s << endl; + } - s << INDENT << cpythonWrapperCPtr(metaField->enclosingClass(), "self") << "->" << metaField->name() << " = "; + s << INDENT << fieldStr << " = "; writeToCppConversion(s, metaField->type(), metaField->enclosingClass(), "value"); - s << ';' << endl; + s << ';' << endl << endl; + + if (pythonWrapperRefCounting) { + s << INDENT << "Py_XDECREF(oldvalue);" << endl; + s << endl; + } s << INDENT << "return 0;" << endl; s << '}' << endl; |