aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken/basewrapper.cpp
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-03-29 17:22:40 -0300
committerHugo Lima <hugo.lima@openbossa.org>2010-03-30 17:41:39 -0300
commitd3b8a53760ba7c768aaeb547ea541f0806e6e999 (patch)
tree98d486465605cc878a51248b7f69a9e1cca810f7 /libshiboken/basewrapper.cpp
parentb0f8a5c519297bff918c864e76a3bc66e51980c9 (diff)
Use a non-template function for Python object deallocation.
Diffstat (limited to 'libshiboken/basewrapper.cpp')
-rw-r--r--libshiboken/basewrapper.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index 0d55ede18..eb3f24d06 100644
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -222,6 +222,28 @@ bool importModule(const char* moduleName, PyTypeObject*** cppApiPtr)
// Wrapper metatype and base type ----------------------------------------------------------
+void deallocWrapper(PyObject* pyObj)
+{
+ SbkBaseWrapper* sbkObj = reinterpret_cast<SbkBaseWrapper*>(pyObj);
+ if (sbkObj->weakreflist)
+ PyObject_ClearWeakRefs(pyObj);
+
+ BindingManager::instance().releaseWrapper(pyObj);
+ if (SbkBaseWrapper_hasOwnership(pyObj)) {
+ SbkBaseWrapperType* sbkType = reinterpret_cast<SbkBaseWrapperType*>(pyObj->ob_type);
+ assert(!sbkType->is_python_type);
+ sbkType->cpp_dtor(sbkObj->cptr);
+ }
+
+ if (SbkBaseWrapper_hasParentInfo(pyObj))
+ destroyParentInfo(sbkObj);
+ SbkBaseWrapper_clearReferences(sbkObj);
+
+ delete sbkObj->cptr;
+ sbkObj->cptr = 0;
+ Py_TYPE(pyObj)->tp_free(pyObj);
+}
+
static PyObject*
SbkBaseWrapperType_TpNew(PyTypeObject* metatype, PyObject* args, PyObject* kwds)
{