aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2011-03-18 17:35:16 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:15:18 -0300
commit0a34ce608e76a96c5bf9fbf8b363aaa0256e9396 (patch)
tree211867b05f7e7d6453686d67fbe18f93806ad11c /libshiboken
parenteb01027ab9266bc0d87fa396e419929567dadea1 (diff)
Fix bug 693 - "Heap corruption or double free reported on program exit"
Reviewer: Renato Araújo <renato.filho@openbossa.org> Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'libshiboken')
-rw-r--r--libshiboken/basewrapper.cpp3
-rw-r--r--libshiboken/basewrapper_p.h8
-rw-r--r--libshiboken/typeresolver.cpp18
3 files changed, 28 insertions, 1 deletions
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<SbkObjectType*>(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 <cstdlib>
#include <string>
+#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<PyTypeObject*>(&SbkObject_Type))) {
+ SbkObjectType* sbkType = reinterpret_cast<SbkObjectType*>(pyType);
+ if (!sbkType->d->type_behaviour) {
+ int len = strlen(typeName);
+ sbkType->d->type_behaviour = typeName[len -1] == '*' ? BEHAVIOUR_OBJECTTYPE : BEHAVIOUR_VALUETYPE;
+ }
+ }
}
return tr;
}