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 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->wrapped);
Py_VISIT(self->connection); Py_VISIT(self->connection);
return 0; return 0;
} }
static void static int
list_dealloc(PyObject* obj) list_clear(listObject *self)
{ {
listObject *self = (listObject *)obj;
Py_CLEAR(self->wrapped); Py_CLEAR(self->wrapped);
Py_CLEAR(self->connection); 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, " 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 static int
@ -227,7 +231,7 @@ PyTypeObject listType = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"psycopg2._psycopg.List", "psycopg2._psycopg.List",
sizeof(listObject), 0, sizeof(listObject), 0,
list_dealloc, /*tp_dealloc*/ (destructor)list_dealloc, /*tp_dealloc*/
0, /*tp_print*/ 0, /*tp_print*/
0, /*tp_getattr*/ 0, /*tp_getattr*/
0, /*tp_setattr*/ 0, /*tp_setattr*/
@ -244,8 +248,8 @@ PyTypeObject listType = {
0, /*tp_as_buffer*/ 0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
listType_doc, /*tp_doc*/ listType_doc, /*tp_doc*/
list_traverse, /*tp_traverse*/ (traverseproc)list_traverse, /*tp_traverse*/
0, /*tp_clear*/ (inquiry)list_clear, /*tp_clear*/
0, /*tp_richcompare*/ 0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/ 0, /*tp_weaklistoffset*/
0, /*tp_iter*/ 0, /*tp_iter*/

View File

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