diff options
author | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2011-01-13 15:04:03 -0300 |
---|---|---|
committer | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2011-01-17 10:48:28 -0300 |
commit | 99760ad3ed66e619e04defcdfe05710899c7afc9 (patch) | |
tree | 30a95eeb2f2a77e8ce632d65ade16b63e0755c7a | |
parent | 2094d56e312a9f35e606cac30aff4bdd0f2dd13d (diff) | |
download | shiboken-99760ad3ed66e619e04defcdfe05710899c7afc9.tar.gz shiboken-99760ad3ed66e619e04defcdfe05710899c7afc9.tar.xz shiboken-99760ad3ed66e619e04defcdfe05710899c7afc9.zip |
Used c++ pointer during the c++ class attribute get function.
Now all function get for class attribute return the internal memory of
the c++ attribute.
Reviewer: Hugo Parente <hugo.lima@openbossa.org>
Luciano Wolf <luciano.wolf@openbossa.org>
-rw-r--r-- | generator/cppgenerator.cpp | 34 | ||||
-rw-r--r-- | libshiboken/bindingmanager.cpp | 2 | ||||
-rw-r--r-- | tests/samplebinding/class_fields_test.py | 9 |
3 files changed, 36 insertions, 9 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 92dbf1f7..28ab0b71 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -2709,18 +2709,40 @@ void CppGenerator::writeGetterFunction(QTextStream& s, const AbstractMetaField* { s << "static PyObject* " << cpythonGetterFunctionName(metaField) << "(PyObject* self, void*)" << endl; s << '{' << endl; - s << INDENT << "return "; + s << INDENT << "PyObject* val = "; QString cppField; + AbstractMetaType *metaType = metaField->type(); + // Force use of pointer to return internal variable memory + bool useReference = (!metaType->isConstant() && + !metaType->isEnum() && + !metaType->isPrimitive() && + metaType->indirections() == 0); + #ifdef AVOID_PROTECTED_HACK if (metaField->isProtected()) - cppField = QString("((%1*)%2)->%3()").arg(wrapperName(metaField->enclosingClass())).arg(cpythonWrapperCPtr(metaField->enclosingClass(), "self")).arg(protectedFieldGetterName(metaField)); + cppField = QString("(%1(%2*)%3)->%4()") + .arg(useReference ? '&' : ' ') + .arg(wrapperName(metaField->enclosingClass())) + .arg(cpythonWrapperCPtr(metaField->enclosingClass(), "self")) + .arg(protectedFieldGetterName(metaField)); else #endif - cppField= QString("%1->%2").arg(cpythonWrapperCPtr(metaField->enclosingClass(), "self")).arg(metaField->name()); - writeToPythonConversion(s, metaField->type(), metaField->enclosingClass(), cppField); - s << ';' << endl; - s << '}' << endl; + cppField= QString("%1%2->%3") + .arg(useReference ? '&' : ' ') + .arg(cpythonWrapperCPtr(metaField->enclosingClass(), "self")) + .arg(metaField->name()); + + if (useReference) { + s << INDENT << "Shiboken::createWrapper(" << cppField << ");" << endl; + s << INDENT << "Shiboken::Object::releaseOwnership(val);" << endl; + } else { + writeToPythonConversion(s, metaField->type(), metaField->enclosingClass(), cppField); + s << ';' << endl; + } + + s << INDENT << "return val;" << endl + << endl << '}' << endl; } void CppGenerator::writeSetterFunction(QTextStream& s, const AbstractMetaField* metaField) diff --git a/libshiboken/bindingmanager.cpp b/libshiboken/bindingmanager.cpp index 3aa4c88e..ba9f77eb 100644 --- a/libshiboken/bindingmanager.cpp +++ b/libshiboken/bindingmanager.cpp @@ -128,8 +128,6 @@ void BindingManager::BindingManagerPrivate::assignWrapper(SbkObject* wrapper, co WrapperMap::iterator iter = wrapperMapper.find(cptr); if (iter == wrapperMapper.end()) wrapperMapper.insert(std::make_pair(cptr, wrapper)); - else - iter->second = wrapper; } BindingManager::BindingManager() diff --git a/tests/samplebinding/class_fields_test.py b/tests/samplebinding/class_fields_test.py index f0791e1d..c01a6bf0 100644 --- a/tests/samplebinding/class_fields_test.py +++ b/tests/samplebinding/class_fields_test.py @@ -64,7 +64,14 @@ class TestAccessingCppFields(unittest.TestCase): new_value = Point(-10, 537) d.valueTypeField = new_value self.assertEqual(d.valueTypeField, new_value) - self.assert_(not d.valueTypeField == old_value) + + #object modify + d.valueTypeField.setX(10) + d.valueTypeField.setY(20) + self.assertEqual(d.valueTypeField.x(), 10) + self.assertEqual(d.valueTypeField.y(), 20) + + # attribution with invalid type self.assertRaises(TypeError, lambda : setattr(d, 'valueTypeField', 123)) |