summaryrefslogtreecommitdiff
path: root/Objects/setobject.c
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2009-01-03 23:52:55 +0000
committerGeorg Brandl <georg@python.org>2009-01-03 23:52:55 +0000
commit4688ea75d55d3d4104794bfe3c570328ea1388b2 (patch)
treebe34b943482215c0e2eb9900ed7920dff1767ead /Objects/setobject.c
parentda4a31811c7425805c2d0db5d3ba461ac41f77c8 (diff)
downloadcpython-git-4688ea75d55d3d4104794bfe3c570328ea1388b2.tar.gz
Merged revisions 68132 via svnmerge from
svn+ssh://svn.python.org/python/branches/py3k ................ r68132 | antoine.pitrou | 2009-01-01 16:35:33 +0100 (Thu, 01 Jan 2009) | 9 lines Merged revisions 68128 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r68128 | antoine.pitrou | 2009-01-01 15:11:22 +0100 (jeu., 01 janv. 2009) | 3 lines Issue #3680: Reference cycles created through a dict, set or deque iterator did not get collected. ........ ................
Diffstat (limited to 'Objects/setobject.c')
-rw-r--r--Objects/setobject.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/Objects/setobject.c b/Objects/setobject.c
index eb223a3bb6..d3243dd77a 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -802,7 +802,14 @@ static void
setiter_dealloc(setiterobject *si)
{
Py_XDECREF(si->si_set);
- PyObject_Del(si);
+ PyObject_GC_Del(si);
+}
+
+static int
+setiter_traverse(setiterobject *si, visitproc visit, void *arg)
+{
+ Py_VISIT(si->si_set);
+ return 0;
}
static PyObject *
@@ -880,9 +887,9 @@ PyTypeObject PySetIter_Type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
0, /* tp_doc */
- 0, /* tp_traverse */
+ (traverseproc)setiter_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
@@ -895,7 +902,7 @@ PyTypeObject PySetIter_Type = {
static PyObject *
set_iter(PySetObject *so)
{
- setiterobject *si = PyObject_New(setiterobject, &PySetIter_Type);
+ setiterobject *si = PyObject_GC_New(setiterobject, &PySetIter_Type);
if (si == NULL)
return NULL;
Py_INCREF(so);
@@ -903,6 +910,7 @@ set_iter(PySetObject *so)
si->si_used = so->used;
si->si_pos = 0;
si->len = so->used;
+ _PyObject_GC_TRACK(si);
return (PyObject *)si;
}