mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-02-07 12:50:32 +03:00
Added tp_clear method for objects with GC support
This commit is contained in:
parent
1a93279fe7
commit
67c8250081
|
@ -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*/
|
||||
|
|
|
@ -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*/
|
||||
|
|
Loading…
Reference in New Issue
Block a user