mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-07-10 16:22:33 +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
|
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*/
|
||||||
|
|
|
@ -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*/
|
||||||
|
|
Loading…
Reference in New Issue
Block a user