aboutsummaryrefslogtreecommitdiffstats
path: root/libshiboken
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-05-03 16:41:38 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:15:22 -0300
commitc2d2ed94548d0e42c3dcc949b1b4f4990684f735 (patch)
treeebc9348884370deab28345fc9121ed74f8457a29 /libshiboken
parentf26d9a83d5255d9ff8ce251790227ebe996d21c8 (diff)
Improved garbage collector handling of Shiboken types.
Diffstat (limited to 'libshiboken')
-rw-r--r--libshiboken/basewrapper.cpp35
1 files changed, 27 insertions, 8 deletions
diff --git a/libshiboken/basewrapper.cpp b/libshiboken/basewrapper.cpp
index a34ef1fef..3ea0507ef 100644
--- a/libshiboken/basewrapper.cpp
+++ b/libshiboken/basewrapper.cpp
@@ -76,9 +76,9 @@ PyTypeObject SbkObjectType_Type = {
/*tp_descr_set*/ 0,
/*tp_dictoffset*/ 0,
/*tp_init*/ 0,
- /*tp_alloc*/ 0,
+ /*tp_alloc*/ PyType_GenericAlloc,
/*tp_new*/ SbkObjectTypeTpNew,
- /*tp_free*/ 0,
+ /*tp_free*/ PyObject_GC_Del,
/*tp_is_gc*/ 0,
/*tp_bases*/ 0,
/*tp_mro*/ 0,
@@ -102,6 +102,22 @@ static PyGetSetDef SbkObjectGetSetList[] = {
{0} // Sentinel
};
+static int SbkObject_traverse(PyObject* self, visitproc visit, void* arg)
+{
+ SbkObject* sbkSelf = reinterpret_cast<SbkObject*>(self);
+ if (sbkSelf->ob_dict)
+ Py_VISIT(sbkSelf->ob_dict);
+ return 0;
+}
+
+static int SbkObject_clear(PyObject* self)
+{
+ SbkObject* sbkSelf = reinterpret_cast<SbkObject*>(self);
+ if (sbkSelf->ob_dict)
+ Py_CLEAR(sbkSelf->ob_dict);
+ return 0;
+}
+
SbkObjectType SbkObject_Type = { { {
PyObject_HEAD_INIT(&SbkObjectType_Type)
/*ob_size*/ 0,
@@ -123,10 +139,10 @@ SbkObjectType SbkObject_Type = { { {
/*tp_getattro*/ 0,
/*tp_setattro*/ 0,
/*tp_as_buffer*/ 0,
- /*tp_flags*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
+ /*tp_flags*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC,
/*tp_doc*/ 0,
- /*tp_traverse*/ 0,
- /*tp_clear*/ 0,
+ /*tp_traverse*/ SbkObject_traverse,
+ /*tp_clear*/ SbkObject_clear,
/*tp_richcompare*/ 0,
/*tp_weaklistoffset*/ offsetof(SbkObject, weakreflist),
/*tp_iter*/ 0,
@@ -188,9 +204,9 @@ void SbkDeallocWrapperWithPrivateDtor(PyObject* self)
void SbkObjectTypeDealloc(PyObject* pyObj)
{
SbkObjectType* sbkType = reinterpret_cast<SbkObjectType*>(pyObj);
- if (!sbkType->d)
- return;
+ PyObject_GC_UnTrack(pyObj);
+ Py_TRASHCAN_SAFE_BEGIN(pyObj);
if(sbkType->d->user_data && sbkType->d->d_func) {
sbkType->d->d_func(sbkType->d->user_data);
sbkType->d->user_data = 0;
@@ -199,6 +215,7 @@ void SbkObjectTypeDealloc(PyObject* pyObj)
sbkType->d->original_name = 0;
delete sbkType->d;
sbkType->d = 0;
+ Py_TRASHCAN_SAFE_END(pyObj);
}
PyObject* SbkObjectTypeTpNew(PyTypeObject* metatype, PyObject* args, PyObject* kwds)
@@ -275,7 +292,8 @@ PyObject* SbkObjectTypeTpNew(PyTypeObject* metatype, PyObject* args, PyObject* k
PyObject* SbkObjectTpNew(PyTypeObject* subtype, PyObject*, PyObject*)
{
- SbkObject* self = reinterpret_cast<SbkObject*>(subtype->tp_alloc(subtype, 0));
+ SbkObject* self = PyObject_GC_New(SbkObject, subtype);
+ Py_INCREF(reinterpret_cast<PyObject*>(subtype));
SbkObjectPrivate* d = new SbkObjectPrivate;
SbkObjectType* sbkType = reinterpret_cast<SbkObjectType*>(subtype);
@@ -291,6 +309,7 @@ PyObject* SbkObjectTpNew(PyTypeObject* subtype, PyObject*, PyObject*)
self->ob_dict = 0;
self->weakreflist = 0;
self->d = d;
+ PyObject_GC_Track(reinterpret_cast<PyObject*>(self));
return reinterpret_cast<PyObject*>(self);
}