aboutsummaryrefslogtreecommitdiffstats
path: root/cppgenerator.cpp
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2010-02-04 20:05:10 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2010-02-10 08:42:22 -0300
commit54b41b60e7c1b5bf2597cf1cc3ca4da428f2437e (patch)
tree36c5886644ec57b5126081f088c94500504ef35f /cppgenerator.cpp
parentacdd27d2497bbc769025e3efe683f67378bd907e (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.cpp33
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;