From 0a34ce608e76a96c5bf9fbf8b363aaa0256e9396 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Fri, 18 Mar 2011 17:35:16 -0300 Subject: Fix bug 693 - "Heap corruption or double free reported on program exit" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewer: Renato Araújo Luciano Wolf --- libshiboken/basewrapper.cpp | 3 ++- libshiboken/basewrapper_p.h | 8 ++++++++ libshiboken/typeresolver.cpp | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) (limited to 'libshiboken') diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp index 83cd83ca0..d07e876ed 100644 --- a/libshiboken/basewrapper.cpp +++ b/libshiboken/basewrapper.cpp @@ -688,7 +688,8 @@ void getOwnership(PyObject* pyObj) void releaseOwnership(SbkObject* self) { // skip if the ownership have already moved to c++ - if (!self->d->hasOwnership) + SbkObjectType* selfType = reinterpret_cast(self->ob_type); + if (!self->d->hasOwnership || selfType->d->type_behaviour == BEHAVIOUR_VALUETYPE) return; // remove object ownership diff --git a/libshiboken/basewrapper_p.h b/libshiboken/basewrapper_p.h index ba5275001..f57dc9ca2 100644 --- a/libshiboken/basewrapper_p.h +++ b/libshiboken/basewrapper_p.h @@ -82,6 +82,12 @@ struct SbkObjectPrivate Shiboken::RefCountMap* referredObjects; }; +/// The type behaviour was not defined yet +#define BEHAVIOUR_UNDEFINED 0 +/// The type is a value type +#define BEHAVIOUR_VALUETYPE 1 +/// The type is a object type +#define BEHAVIOUR_OBJECTTYPE 2 struct SbkObjectTypePrivate { @@ -101,6 +107,8 @@ struct SbkObjectTypePrivate int is_multicpp:1; /// True if this type was definied by the user. int is_user_type:1; + /// Tells is the type is a value type or an object-type, see BEHAVIOUR_* constants. + int type_behaviour:2; /// C++ name char* original_name; /// Type user data diff --git a/libshiboken/typeresolver.cpp b/libshiboken/typeresolver.cpp index a195c8f08..343fe31a4 100644 --- a/libshiboken/typeresolver.cpp +++ b/libshiboken/typeresolver.cpp @@ -25,6 +25,7 @@ #include "sbkdbg.h" #include #include +#include "basewrapper_p.h" using namespace Shiboken; @@ -68,6 +69,23 @@ TypeResolver* TypeResolver::createTypeResolver(const char* typeName, tr->m_d->cppToPython = cppToPy; tr->m_d->pythonToCpp = pyToCpp; tr->m_d->pyType = pyType; + + /* + * Note: + * + * Value types are also registered as object types, but the generator *always* first register the value + * type version in the TypeResolver and it *must* always do it! otherwise this code wont work. + * + * All this to not enter in this if several times, running all characters in the typeName string, etc... + * in other words... the nano seconds!!! somebody need to save them! + */ + if (pyType && PyType_IsSubtype(pyType, reinterpret_cast(&SbkObject_Type))) { + SbkObjectType* sbkType = reinterpret_cast(pyType); + if (!sbkType->d->type_behaviour) { + int len = strlen(typeName); + sbkType->d->type_behaviour = typeName[len -1] == '*' ? BEHAVIOUR_OBJECTTYPE : BEHAVIOUR_VALUETYPE; + } + } } return tr; } -- cgit v1.2.3