summaryrefslogtreecommitdiffstats
path: root/Objects/iterobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/iterobject.c')
-rw-r--r--Objects/iterobject.c169
1 files changed, 0 insertions, 169 deletions
diff --git a/Objects/iterobject.c b/Objects/iterobject.c
index 454c405..95ee56d 100644
--- a/Objects/iterobject.c
+++ b/Objects/iterobject.c
@@ -230,172 +230,3 @@ PyTypeObject PyCallIter_Type = {
};
-/*********************** Zip Iterator **************************/
-/* Largely copied from itertools.c by Brian Holmes */
-
-typedef struct zipiterobject_t {
- PyObject_HEAD
- PyTupleObject *it_tuple; /* Set to NULL when iterator is exhausted */
- Py_ssize_t resultsize;
- PyTupleObject *result; /* Reusable tuple for optimization */
-} zipiterobject;
-
- /* Forward */
-
-PyObject *
-_PyZip_CreateIter(PyObject* args)
-{
- Py_ssize_t i;
- Py_ssize_t tuplesize;
- PyObject* ziptuple;
- PyObject* result;
- struct zipiterobject_t* zipiter;
-
- assert(PyTuple_Check(args));
-
- if (Py_TYPE(&PyZipIter_Type) == NULL) {
- if (PyType_Ready(&PyZipIter_Type) < 0)
- return NULL;
- }
-
- tuplesize = PySequence_Length((PyObject*) args);
-
- ziptuple = PyTuple_New(tuplesize);
- if (ziptuple == NULL)
- return NULL;
-
- for (i = 0; i < tuplesize; i++) {
- PyObject *o = PyTuple_GET_ITEM(args, i);
- PyObject *it = PyObject_GetIter(o);
- if (it == NULL) {
- /* XXX Should we do this?
- if (PyErr_ExceptionMatches(PyExc_TypeError))
- PyErr_Format(PyExc_TypeError,
- "zip argument #%zd must support iteration",
- I+1);
- */
- Py_DECREF(ziptuple);
- return NULL;
- }
- PyTuple_SET_ITEM(ziptuple, i, it);
- }
-
- /* create a reusable result holder */
- result = PyTuple_New(tuplesize);
- if (result == NULL) {
- Py_DECREF(ziptuple);
- return NULL;
- }
- for (i = 0; i < tuplesize; i++) {
- Py_INCREF(Py_None);
- PyTuple_SET_ITEM(result, i, Py_None);
- }
-
- zipiter = PyObject_GC_New(zipiterobject, &PyZipIter_Type);
- if (zipiter == NULL) {
- Py_DECREF(ziptuple);
- Py_DECREF(result);
- return NULL;
- }
-
- zipiter->result = (PyTupleObject*) result;
- zipiter->resultsize = tuplesize;
- zipiter->it_tuple = (PyTupleObject *) ziptuple;
- _PyObject_GC_TRACK(zipiter);
- return (PyObject *)zipiter;
-}
-
-static void
-zipiter_dealloc(zipiterobject *it)
-{
- _PyObject_GC_UNTRACK(it);
- Py_XDECREF(it->it_tuple);
- Py_XDECREF(it->result);
- PyObject_GC_Del(it);
-}
-
-static int
-zipiter_traverse(zipiterobject *it, visitproc visit, void *arg)
-{
- Py_VISIT(it->it_tuple);
- Py_VISIT(it->result);
- return 0;
-}
-
-static PyObject *
-zipiter_next(zipiterobject *zit)
-{
- Py_ssize_t i;
- Py_ssize_t tuplesize = zit->resultsize;
- PyObject *result = (PyObject*) zit->result;
- PyObject *olditem;
-
- if (tuplesize == 0)
- return NULL;
-
- if (result->ob_refcnt == 1) {
- Py_INCREF(result);
- for (i = 0; i < tuplesize; i++) {
- PyObject *it = PyTuple_GET_ITEM(zit->it_tuple, i);
- PyObject *item;
- assert(PyIter_Check(it));
- item = (*it->ob_type->tp_iternext)(it);
- if (item == NULL) {
- Py_DECREF(result);
- return NULL;
- }
- olditem = PyTuple_GET_ITEM(result, i);
- PyTuple_SET_ITEM(result, i, item);
- Py_DECREF(olditem);
- }
- } else {
- result = PyTuple_New(tuplesize);
- if (result == NULL)
- return NULL;
- for (i = 0; i < tuplesize; i++) {
- PyObject *it = PyTuple_GET_ITEM(zit->it_tuple, i);
- PyObject *item;
- assert(PyIter_Check(it));
- item = (*it->ob_type->tp_iternext)(it);
- if (item == NULL) {
- Py_DECREF(result);
- return NULL;
- }
- PyTuple_SET_ITEM(result, i, item);
- }
- }
- return result;
-}
-
-PyTypeObject PyZipIter_Type = {
- PyVarObject_HEAD_INIT(0, 0)
- "zip_iterator", /* tp_name */
- sizeof(zipiterobject), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)zipiter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
- 0, /* tp_doc */
- (traverseproc)zipiter_traverse, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weakzipoffset */
- PyObject_SelfIter, /* tp_iter */
- (iternextfunc)zipiter_next, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
-};