diff options
| author | Georg Brandl <georg@python.org> | 2009-01-03 23:52:55 +0000 |
|---|---|---|
| committer | Georg Brandl <georg@python.org> | 2009-01-03 23:52:55 +0000 |
| commit | 4688ea75d55d3d4104794bfe3c570328ea1388b2 (patch) | |
| tree | be34b943482215c0e2eb9900ed7920dff1767ead /Objects/setobject.c | |
| parent | da4a31811c7425805c2d0db5d3ba461ac41f77c8 (diff) | |
| download | cpython-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.c | 16 |
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; } |
