Implement traversal for Diagnostics object

Triyng to fix a reported memory leak with diags, but implementing
traversing doesn't help. Quite the opposite in the example provided in
bug #557, the leak is present even with the `del diag`.

The leak appears with Python 3.5, not with Python 2.7.
This commit is contained in:
Daniele Varrazzo 2017-05-18 12:24:48 +01:00
parent 165449c724
commit 9f6bab692d

View File

@ -132,10 +132,23 @@ diagnostics_init(diagnosticsObject *self, PyObject *args, PyObject *kwds)
return 0;
}
static int
diagnostics_traverse(diagnosticsObject *self, visitproc visit, void *arg)
{
Py_VISIT(self->err);
return 0;
}
static int
diagnostics_clear(diagnosticsObject *self)
{
Py_CLEAR(self->err);
return 0;
}
static void
diagnostics_dealloc(diagnosticsObject* self)
{
Py_CLEAR(self->err);
Py_TYPE(self)->tp_free((PyObject *)self);
}
@ -175,10 +188,10 @@ PyTypeObject diagnosticsType = {
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /*tp_flags*/
Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
diagnosticsType_doc, /*tp_doc*/
0, /*tp_traverse*/
0, /*tp_clear*/
(traverseproc)diagnostics_traverse, /*tp_traverse*/
(inquiry)diagnostics_clear, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
0, /*tp_iter*/