diff --git a/psycopg/adapter_list.c b/psycopg/adapter_list.c index 59aff42e..7e2b7e3b 100644 --- a/psycopg/adapter_list.c +++ b/psycopg/adapter_list.c @@ -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*/ diff --git a/psycopg/typecast.c b/psycopg/typecast.c index 048f44a6..ecaab0dd 100644 --- a/psycopg/typecast.c +++ b/psycopg/typecast.c @@ -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*/