summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2009-02-16 20:39:12 (GMT)
committerRaymond Hettinger <python@rcn.com>2009-02-16 20:39:12 (GMT)
commitb21d8109af7b6b3577e566e8c485ec5bcde20181 (patch)
tree03231364353c78206be77c05d95e366bf5df9580
parentafb5a48be22c118bcba108d481cfbc91e27295ee (diff)
downloadcpython-b21d8109af7b6b3577e566e8c485ec5bcde20181.zip
cpython-b21d8109af7b6b3577e566e8c485ec5bcde20181.tar.gz
cpython-b21d8109af7b6b3577e566e8c485ec5bcde20181.tar.bz2
Add GC support to count() objects. Backport candidate.
-rw-r--r--Lib/test/test_itertools.py5
-rw-r--r--Modules/itertoolsmodule.c18
2 files changed, 19 insertions, 4 deletions
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index ce5c898..a33939e 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -966,6 +966,11 @@ class TestGC(unittest.TestCase):
a = []
self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a)
+ def test_count(self):
+ a = []
+ Int = type('Int', (int,), dict(x=a))
+ self.makecycle(count(Int(0), Int(1)), a)
+
def test_cycle(self):
a = []
self.makecycle(cycle([a]*2), a)
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 8a40427..7d1791b 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -3271,7 +3271,7 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
cnt == PY_SSIZE_T_MAX && long_cnt != NULL);
/* create countobject structure */
- lz = (countobject *)PyObject_New(countobject, &count_type);
+ lz = (countobject *)type->tp_alloc(type, 0);
if (lz == NULL) {
Py_XDECREF(long_cnt);
return NULL;
@@ -3286,9 +3286,17 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
static void
count_dealloc(countobject *lz)
{
+ PyObject_GC_UnTrack(lz);
Py_XDECREF(lz->long_cnt);
Py_XDECREF(lz->long_step);
- PyObject_Del(lz);
+ Py_TYPE(lz)->tp_free(lz);
+}
+
+count_traverse(countobject *lz, visitproc visit, void *arg)
+{
+ Py_VISIT(lz->long_cnt);
+ Py_VISIT(lz->long_step);
+ return 0;
}
static PyObject *
@@ -3384,9 +3392,10 @@ static PyTypeObject count_type = {
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
+ Py_TPFLAGS_BASETYPE, /* tp_flags */
count_doc, /* tp_doc */
- 0, /* tp_traverse */
+ (traverseproc)count_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
@@ -3403,6 +3412,7 @@ static PyTypeObject count_type = {
0, /* tp_init */
0, /* tp_alloc */
count_new, /* tp_new */
+ PyObject_GC_Del, /* tp_free */
};