diff options
author | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2010-11-23 11:42:08 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:08:59 -0300 |
commit | d17a105e2e71afd1f0b20576b73dcd95b5ca1806 (patch) | |
tree | 4bb1e469947cf248b3a6fb21684d6d3b8476dbbb | |
parent | 73360b909285ebfd57a0d24b83c64232b4d05a95 (diff) |
Fixed generation with AVOID_PROTECTED_HACK.
Fixes bug #476.
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org>
Hugo Parente Lima <hugo.pl@gmail.com>
-rw-r--r-- | generator/cppgenerator.cpp | 66 | ||||
-rw-r--r-- | libshiboken/basewrapper.cpp | 9 | ||||
-rw-r--r-- | libshiboken/basewrapper_p.h | 2 |
3 files changed, 47 insertions, 30 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp index 284b20f81..b1f8d5733 100644 --- a/generator/cppgenerator.cpp +++ b/generator/cppgenerator.cpp @@ -2010,27 +2010,35 @@ void CppGenerator::writeMethodCall(QTextStream& s, const AbstractMetaFunction* f mc << ')'; } else { if (func->ownerClass()) { -#ifndef AVOID_PROTECTED_HACK - if (func->isStatic()) - mc << func->ownerClass()->qualifiedCppName() << "::"; - else - mc << CPP_SELF_VAR "->"; +#ifdef AVOID_PROTECTED_HACK + if (!func->isProtected()) { +#endif + if (func->isStatic()) + mc << func->ownerClass()->qualifiedCppName() << "::"; + else { +#ifdef AVOID_PROTECTED_HACK + if (!func->isVirtual() && func->ownerClass()->hasProtectedMembers()) + mc << "((" << func->ownerClass()->qualifiedCppName() << "*)" << CPP_SELF_VAR << ")->"; + else +#endif + mc << CPP_SELF_VAR "->"; + } - if (!func->isAbstract() && func->isVirtual()) - mc << "::%CLASS_NAME::"; + if (!func->isAbstract() && func->isVirtual()) + mc << "::%CLASS_NAME::"; - mc << func->originalName(); -#else - if (func->isStatic()) - mc << func->ownerClass()->qualifiedCppName() << "::"; - else { - if (func->isProtected()) - mc << "((" << wrapperName(func->ownerClass()) << "*) "; - mc << CPP_SELF_VAR << (func->isProtected() ? ")" : "") << "->"; + + mc << func->originalName(); + +#ifdef AVOID_PROTECTED_HACK + } else { + if (!func->isStatic()) + mc << "((" << wrapperName(func->ownerClass()) << "*) " << CPP_SELF_VAR << ")->"; + + if (!func->isAbstract()) + mc << (func->isProtected() ? wrapperName(func->ownerClass()) : "::" + func->ownerClass()->qualifiedCppName()) << "::"; + mc << func->originalName() << "_protected"; } - if (!func->isAbstract() && func->isVirtual()) - mc << (func->isProtected() ? wrapperName(func->ownerClass()) : "::%CLASS_NAME::"); - mc << func->originalName() << (func->isProtected() ? "_protected" : ""); #endif } else { mc << func->originalName(); @@ -2038,13 +2046,19 @@ void CppGenerator::writeMethodCall(QTextStream& s, const AbstractMetaFunction* f mc << '(' << userArgs.join(", ") << ')'; if (!func->isAbstract() && func->isVirtual()) { mc.flush(); - QString virtualCall(methodCall); - QString normalCall(methodCall); +#ifndef AVOID_PROTECTED_HACK + if (!func->isProtected()) +#endif + { + QString virtualCall(methodCall); + QString normalCall(methodCall); + + virtualCall = virtualCall.replace("%CLASS_NAME", func->ownerClass()->qualifiedCppName()); + normalCall = normalCall.replace("::%CLASS_NAME::", ""); + methodCall = ""; - virtualCall = virtualCall.replace("%CLASS_NAME", func->ownerClass()->qualifiedCppName()); - normalCall = normalCall.replace("::%CLASS_NAME::", ""); - methodCall = ""; - mc << "(Shiboken::Wrapper::isUserType(self) ? " << virtualCall << ":" << normalCall << ")"; + mc << "(Shiboken::Wrapper::isUserType(self) ? " << virtualCall << ":" << normalCall << ")"; + } } } } @@ -3247,6 +3261,10 @@ void CppGenerator::writeClassRegister(QTextStream& s, const AbstractMetaClass* m if (metaClass->hasProtectedDestructor()) dtorClassName = wrapperName(metaClass); #endif + // call the real destructor + if (metaClass->typeEntry()->isValue()) + dtorClassName = wrapperName(metaClass); + s << INDENT << "Shiboken::BaseType::setDestructorFunction(&" << cpythonTypeName(metaClass) << ", &Shiboken::callCppDestructor<" << dtorClassName << " >);" << endl; } diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index 39c18c3e1..6fb69bf91 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -170,7 +170,7 @@ void SbkDeallocWrapper(PyObject* pyObj) } } - Shiboken::Wrapper::deallocData(sbkObj); + Shiboken::Wrapper::deallocData(sbkObj, !sbkObj->d->containsCppWrapper); } void SbkDeallocWrapperWithPrivateDtor(PyObject* self) @@ -179,8 +179,7 @@ void SbkDeallocWrapperWithPrivateDtor(PyObject* self) if (sbkObj->weakreflist) PyObject_ClearWeakRefs(self); - Shiboken::BindingManager::instance().releaseWrapper(sbkObj); - Shiboken::Wrapper::deallocData(sbkObj); + Shiboken::Wrapper::deallocData(sbkObj, true); } void SbkBaseTypeDealloc(PyObject* pyObj) @@ -927,10 +926,10 @@ void setParent(PyObject* parent, PyObject* child) Py_DECREF(child); } -void deallocData(SbkObject* self) +void deallocData(SbkObject* self, bool cleanup) { // Make cleanup if this is not a wrapper otherwise this will be done on wrapper destructor - if(!self->d->containsCppWrapper) { + if(cleanup) { removeParent(self); if (self->d->parentInfo) diff --git a/libshiboken/basewrapper_p.h b/libshiboken/basewrapper_p.h index 702fdbd07..428159e0a 100644 --- a/libshiboken/basewrapper_p.h +++ b/libshiboken/basewrapper_p.h @@ -229,7 +229,7 @@ void clearReferences(SbkObject* self); /** * Destroy internal data **/ -void deallocData(SbkObject* self); +void deallocData(SbkObject* self, bool doCleanup); } // namespace Wrapper } // namespace Shiboken |