Added tp_clear method for objects with GC support

This commit is contained in:
Daniele Varrazzo 2013-04-05 01:05:12 +01:00
parent 1a93279fe7
commit 67c8250081
2 changed files with 30 additions and 25 deletions

View File

@ -172,27 +172,31 @@ list_setup(listObject *self, PyObject *obj)
}
static int
list_traverse(PyObject *obj, visitproc visit, void *arg)
list_traverse(listObject *self, visitproc visit, void *arg)
{
listObject *self = (listObject *)obj;
Py_VISIT(self->wrapped);
Py_VISIT(self->connection);
return 0;
}
static void
list_dealloc(PyObject* obj)
static int
list_clear(listObject *self)
{
listObject *self = (listObject *)obj;
Py_CLEAR(self->wrapped);
Py_CLEAR(self->connection);
return 0;
}
static void
list_dealloc(listObject* self)
{
PyObject_GC_UnTrack((PyObject *)self);
list_clear(self);
Dprintf("list_dealloc: deleted list object at %p, "
"refcnt = " FORMAT_CODE_PY_SSIZE_T, obj, Py_REFCNT(obj));
"refcnt = " FORMAT_CODE_PY_SSIZE_T, self, Py_REFCNT(self));
Py_TYPE(obj)->tp_free(obj);
Py_TYPE(self)->tp_free((PyObject *)self);
}
static int
@ -227,7 +231,7 @@ PyTypeObject listType = {
PyVarObject_HEAD_INIT(NULL, 0)
"psycopg2._psycopg.List",
sizeof(listObject), 0,
list_dealloc, /*tp_dealloc*/
(destructor)list_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
@ -244,8 +248,8 @@ PyTypeObject listType = {
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
listType_doc, /*tp_doc*/
list_traverse, /*tp_traverse*/
0, /*tp_clear*/
(traverseproc)list_traverse, /*tp_traverse*/
(inquiry)list_clear, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
0, /*tp_iter*/

View File

@ -414,26 +414,27 @@ static struct PyMemberDef typecastObject_members[] = {
{NULL}
};
static void
typecast_dealloc(PyObject *obj)
static int
typecast_clear(typecastObject *self)
{
typecastObject *self = (typecastObject*)obj;
PyObject_GC_UnTrack(self);
Py_CLEAR(self->values);
Py_CLEAR(self->name);
Py_CLEAR(self->pcast);
Py_CLEAR(self->bcast);
return 0;
}
Py_TYPE(obj)->tp_free(obj);
static void
typecast_dealloc(typecastObject *self)
{
PyObject_GC_UnTrack(self);
typecast_clear(self);
Py_TYPE(self)->tp_free((PyObject *)self);
}
static int
typecast_traverse(PyObject *obj, visitproc visit, void *arg)
typecast_traverse(typecastObject *self, visitproc visit, void *arg)
{
typecastObject *self = (typecastObject*)obj;
Py_VISIT(self->values);
Py_VISIT(self->name);
Py_VISIT(self->pcast);
@ -484,7 +485,7 @@ PyTypeObject typecastType = {
PyVarObject_HEAD_INIT(NULL, 0)
"psycopg2._psycopg.type",
sizeof(typecastObject), 0,
typecast_dealloc, /*tp_dealloc*/
(destructor)typecast_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
@ -502,8 +503,8 @@ PyTypeObject typecastType = {
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_RICHCOMPARE |
Py_TPFLAGS_HAVE_GC, /*tp_flags*/
"psycopg type-casting object", /*tp_doc*/
typecast_traverse, /*tp_traverse*/
0, /*tp_clear*/
(traverseproc)typecast_traverse, /*tp_traverse*/
(inquiry)typecast_clear, /*tp_clear*/
typecast_richcompare, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
0, /*tp_iter*/