summaryrefslogtreecommitdiffstats
path: root/Objects/iterobject.c
diff options
context:
space:
mode:
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>2001-07-12 13:27:25 (GMT)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>2001-07-12 13:27:25 (GMT)
commit7eac9b72d45f68d82e1dc463d1050aa86af94709 (patch)
tree333805f4bae23251cbdb99ea1a65cd7e19dcea7e /Objects/iterobject.c
parent19cd292bbcf1ac3c7e07750ba8c6a3b6b1a479ff (diff)
downloadcpython-7eac9b72d45f68d82e1dc463d1050aa86af94709.zip
cpython-7eac9b72d45f68d82e1dc463d1050aa86af94709.tar.gz
cpython-7eac9b72d45f68d82e1dc463d1050aa86af94709.tar.bz2
GC for iterator objects.
Diffstat (limited to 'Objects/iterobject.c')
-rw-r--r--Objects/iterobject.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 6a11772..c4f4e61 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -18,15 +18,24 @@ PySeqIter_New(PyObject *seq)
it->it_index = 0;
Py_INCREF(seq);
it->it_seq = seq;
+ PyObject_GC_Init(it);
return (PyObject *)it;
}
static void
iter_dealloc(seqiterobject *it)
{
+ PyObject_GC_Fini(it);
Py_DECREF(it->it_seq);
+ it = (seqiterobject *) PyObject_AS_GC(it);
PyObject_DEL(it);
}
+static int
+iter_traverse(seqiterobject *it, visitproc visit, void *arg)
+{
+ return visit(it->it_seq, arg);
+}
+
static PyObject *
iter_next(seqiterobject *it, PyObject *args)
{
@@ -97,7 +106,7 @@ PyTypeObject PySeqIter_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /* ob_size */
"iterator", /* tp_name */
- sizeof(seqiterobject), /* tp_basicsize */
+ sizeof(seqiterobject) + PyGC_HEAD_SIZE, /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)iter_dealloc, /* tp_dealloc */
@@ -115,9 +124,9 @@ PyTypeObject PySeqIter_Type = {
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
0, /* tp_doc */
- 0, /* tp_traverse */
+ (traverseproc)iter_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
@@ -144,16 +153,30 @@ PyCallIter_New(PyObject *callable, PyObject *sentinel)
it->it_callable = callable;
Py_INCREF(sentinel);
it->it_sentinel = sentinel;
+ PyObject_GC_Init(it);
return (PyObject *)it;
}
static void
calliter_dealloc(calliterobject *it)
{
+ PyObject_GC_Fini(it);
Py_DECREF(it->it_callable);
Py_DECREF(it->it_sentinel);
+ it = (calliterobject *) PyObject_AS_GC(it);
PyObject_DEL(it);
}
+static int
+calliter_traverse(calliterobject *it, visitproc visit, void *arg)
+{
+ int err;
+ if ((err = visit(it->it_callable, arg)))
+ return err;
+ if ((err = visit(it->it_sentinel, arg)))
+ return err;
+ return 0;
+}
+
static PyObject *
calliter_next(calliterobject *it, PyObject *args)
{
@@ -200,7 +223,7 @@ PyTypeObject PyCallIter_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /* ob_size */
"callable-iterator", /* tp_name */
- sizeof(calliterobject), /* tp_basicsize */
+ sizeof(calliterobject) + PyGC_HEAD_SIZE,/* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)calliter_dealloc, /* tp_dealloc */
@@ -218,9 +241,9 @@ PyTypeObject PyCallIter_Type = {
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
0, /* tp_doc */
- 0, /* tp_traverse */
+ (traverseproc)calliter_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */