} static voidtakewhile_dealloc(takewhileobject *lz){ PyObject_GC_UnTrack(lz); Py_XDECREF(lz->func); Py_XDECREF(lz->it); lz->ob_type->tp_free(lz);} static inttakewhile_traverse(takewhileobject *lz, visitproc visit, void *arg){ Py_VISIT(lz->it); Py_VISIT(lz->func); return 0;} static PyObject *takewhile_next(takewhileobject *lz){ PyObject *item, *good; PyObject *it = lz->it; long ok; if (lz->stop == 1) return NULL; assert(PyIter_Check(it)); item = (*it->ob_type->tp_iternext)(it); if (item == NULL) return NULL; good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); if (good == NULL) { Py_DECREF(item); return NULL; } ok = PyObject_IsTrue(good); Py_DECREF(good); if (ok) return item; Py_DECREF(item); lz->stop = 1; return NULL;} PyDoc_STRVAR(takewhile_doc,"takewhile(predicate, iterable) --> takewhile object\n\\n\Return successive entries from an iterable as long as the \n\predicate evaluates to true for each entry."); static PyTypeObject takewhile_type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "itertools.takewhile", /* tp_name */ sizeof(takewhileobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)takewhile_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ takewhile_doc, /* tp_doc */ (traverseproc)takewhile_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)takewhile_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ takewhile_new, /* tp_new */ PyObject_GC_Del, /* tp_free */}; /* islice object ************************************************************/ typedef struct { PyObject_HEAD PyObject *it; Py_ssize_t next; Py_ssize_t stop; Py_ssize_t step; Py_ssize_t cnt;} isliceobject; static PyTypeObject islice_type; static PyObject *islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds){ PyObject *seq; Py_ssize_t start=0, stop=-1, step=1; PyObject *it, *a1=NULL, *a2=NULL, *a3=NULL; Py_ssize_t numargs; isliceobject *lz; if (type == &islice_type && !_PyArg_NoKeywords("islice()", kwds)) return NULL; if (!PyArg_UnpackTuple(args, "islice", 2, 4, &seq, &a1, &a2, &a3)) return NULL; numargs = PyTuple_Size(args); if (numargs == 2) { if (a1 != Py_None) { stop = PyInt_AsSsize_t(a1); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, "Stop argument for islice() must be a non-negative integer or None."); return NULL; } } } else { if (a1 != Py_None) start = PyInt_AsSsize_t(a1); if (start == -1 && PyErr_Occurred()) PyErr_Clear(); if (a2 != Py_None) { stop = PyInt_AsSsize_t(a2); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, "Stop argument for islice() must be a non-negative integer or None."); return NULL; } } } if (start<0 || stop<-1) { PyErr_SetString(PyExc_ValueError, "Indices for islice() must be non-negative integers or None."); return NULL; } if (a3 != NULL) { if (a3 != Py_None) step = PyInt_AsSsize_t(a3); if (step == -1 && PyErr_Occurred()) PyErr_Clear(); } if (step<1) { PyErr_SetString(PyExc_ValueError, "Step for islice() must be a positive integer or None."); return NULL; } /* Get iterator. */ it = PyObject_GetIter(seq); if (it == NULL) return NULL; /* create isliceobject structure */ lz = (isliceobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(it); return NULL; } lz->it = it; lz->next = start; lz->stop = stop; lz->step = step; lz->cnt = 0L; return (PyObject *)lz;} static voidislice_dealloc(isliceobject *lz){ PyObject_GC_UnTrack(lz); Py_XDECREF(lz->it); lz->ob_type->tp_free(lz);} static intislice_traverse(isliceobject *lz, visitproc visit, void *arg){ Py_VISIT(lz->it); return 0;} static PyObject *islice_next(isliceobject *lz){ PyObject *item; PyObject *it = lz->it; Py_ssize_t oldnext; PyObject *(*iternext)(PyObject *); assert(PyIter_Check(it)); iternext = *it->ob_type->tp_iternext; while (lz->cnt < lz->next) { item = iternext(it); if (item == NULL) return NULL; Py_DECREF(item); lz->cnt++; } if (lz->stop != -1 && lz->cnt >= lz->stop) return NULL; assert(PyIter_Check(it)); item = iternext(it); if (item == NULL) return NULL; lz->cnt++; oldnext = lz->next; lz->next += lz->step; if (lz->next < oldnext) /* Check for overflow */ lz->next = lz->stop; return item;} PyDoc_STRVAR(islice_doc,"islice(iterable, [start,] stop [, step]) --> islice object\n\\n\Return an iterator whose next() method returns selected values from an\n\iterable. If start is specified, will skip all preceding elements;\n\otherwise, start defaults to zero. Step defaults to one. If\n\specified as another value, step determines how many values are \n\skipped between successive calls. Works like a slice() on a list\n\but returns an iterator."); static PyTypeObject islice_type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "itertools.islice", /* tp_name */ sizeof(isliceobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)islice_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ islice_doc, /* tp_doc */ (traverseproc)islice_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)islice_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ islice_new, /* tp_new */ PyObject_GC_Del, /* tp_free */}; /* starmap object ************************************************************/ typedef struct { PyObject_HEAD PyObject *func; PyObject *it;} starmapobject; static PyTypeObject starmap_type; static PyObject *starmap_new(PyTypeObject *type, PyObject *args, PyObject *kwds){ PyObject *func, *seq; PyObject *it; starmapobject *lz; if (type == &starmap_type && !_PyArg_NoKeywords("starmap()", kwds)) return NULL; if (!PyArg_UnpackTuple(args, "starmap", 2, 2, &func, &seq)) return NULL; /* Get iterator. */ it = PyObject_GetIter(seq); if (it == NULL) return NULL; /* create starmapobject structure */ lz = (starmapobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(it); return NULL; } Py_INCREF(func); lz->func = func; lz->it = it; return (PyObject *)lz;} static voidstarmap_dealloc(starmapobject *lz){ PyObject_GC_UnTrack(lz); Py_XDECREF(lz->func); Py_XDECREF(lz->it); lz->ob_type->tp_free(lz);} static intstarmap_traverse(starmapobject *lz, visitproc visit, void *arg){ Py_VISIT(lz->it); Py_VISIT(lz->func); return 0;} static PyObject *starmap_next(starmapobject *lz){ PyObject *args; PyObject *result; PyObject *it = lz->it; assert(PyIter_Check(it)); args = (*it->ob_type->tp_iternext)(it); if (args == NULL) return NULL; if (!PyTuple_CheckExact(args)) { Py_DECREF(args); PyErr_SetString(PyExc_TypeError, "iterator must return a tuple"); return NULL; } result = PyObject_Call(lz->func, args, NULL); Py_DECREF(args); return result;} PyDoc_STRVAR(starmap_doc,"starmap(function, sequence) --> starmap object\n\\n\Return an iterator whose values are returned from the function evaluated\n\with a argument tuple taken from the given sequence."); static PyTypeObject starmap_type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "itertools.starmap", /* tp_name */ sizeof(starmapobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)starmap_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ starmap_doc, /* tp_doc */ (traverseproc)starmap_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)starmap_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ starmap_new, /* tp_new */ PyObject_GC_Del, /* tp_free */}; /* imap object ************************************************************/ typedef struct { PyObject_HEAD PyObject *iters; PyObject *func;} imapobject; static PyTypeObject imap_type; static PyObject *imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds){ PyObject *it, *iters, *func; imapobject *lz; Py_ssize_t numargs, i; if (type == &imap_type && !_PyArg_NoKeywords("imap()", kwds)) return NULL; numargs = PyTuple_Size(args); if (numargs < 2) { PyErr_SetString(PyExc_TypeError, "imap() must have at least two arguments."); return NULL; } iters = PyTuple_New(numargs-1); if (iters == NULL) return NULL; for (i=1 ; i<numargs ; i++) { /* Get iterator. */ it = PyObject_GetIter(PyTuple_GET_ITEM(args, i)); if (it == NULL) { Py_DECREF(iters); return NULL; } PyTuple_SET_ITEM(iters, i-1, it); } /* create imapobject structure */ lz = (imapobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(iters); return NULL; } lz->iters = iters; func = PyTuple_GET_ITEM(args, 0); Py_INCREF(func); lz->func = func; return (PyObject *)lz;} static voidimap_dealloc(imapobject *lz){ PyObject_GC_UnTrack(lz); Py_XDECREF(lz->iters); Py_XDECREF(lz->func); lz->ob_type->tp_free(lz);} static intimap_traverse(imapobject *lz, visitproc visit, void *arg){ Py_VISIT(lz->iters); Py_VISIT(lz->func); return 0;} Lines 1001–1500 of 2550. Previous lines Load more
} static void takewhile_dealloc(takewhileobject *lz) { PyObject_GC_UnTrack(lz); Py_XDECREF(lz->func); Py_XDECREF(lz->it); lz->ob_type->tp_free(lz); } static int takewhile_traverse(takewhileobject *lz, visitproc visit, void *arg) { Py_VISIT(lz->it); Py_VISIT(lz->func); return 0; } static PyObject * takewhile_next(takewhileobject *lz) { PyObject *item, *good; PyObject *it = lz->it; long ok; if (lz->stop == 1) return NULL; assert(PyIter_Check(it)); item = (*it->ob_type->tp_iternext)(it); if (item == NULL) return NULL; good = PyObject_CallFunctionObjArgs(lz->func, item, NULL); if (good == NULL) { Py_DECREF(item); return NULL; } ok = PyObject_IsTrue(good); Py_DECREF(good); if (ok) return item; Py_DECREF(item); lz->stop = 1; return NULL; } PyDoc_STRVAR(takewhile_doc, "takewhile(predicate, iterable) --> takewhile object\n\ \n\ Return successive entries from an iterable as long as the \n\ predicate evaluates to true for each entry."); static PyTypeObject takewhile_type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "itertools.takewhile", /* tp_name */ sizeof(takewhileobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)takewhile_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ takewhile_doc, /* tp_doc */ (traverseproc)takewhile_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)takewhile_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ takewhile_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ }; /* islice object ************************************************************/ typedef struct { PyObject_HEAD PyObject *it; Py_ssize_t next; Py_ssize_t stop; Py_ssize_t step; Py_ssize_t cnt; } isliceobject; static PyTypeObject islice_type; static PyObject * islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *seq; Py_ssize_t start=0, stop=-1, step=1; PyObject *it, *a1=NULL, *a2=NULL, *a3=NULL; Py_ssize_t numargs; isliceobject *lz; if (type == &islice_type && !_PyArg_NoKeywords("islice()", kwds)) return NULL; if (!PyArg_UnpackTuple(args, "islice", 2, 4, &seq, &a1, &a2, &a3)) return NULL; numargs = PyTuple_Size(args); if (numargs == 2) { if (a1 != Py_None) { stop = PyInt_AsSsize_t(a1); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, "Stop argument for islice() must be a non-negative integer or None."); return NULL; } } } else { if (a1 != Py_None) start = PyInt_AsSsize_t(a1); if (start == -1 && PyErr_Occurred()) PyErr_Clear(); if (a2 != Py_None) { stop = PyInt_AsSsize_t(a2); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, "Stop argument for islice() must be a non-negative integer or None."); return NULL; } } } if (start<0 || stop<-1) { PyErr_SetString(PyExc_ValueError, "Indices for islice() must be non-negative integers or None."); return NULL; } if (a3 != NULL) { if (a3 != Py_None) step = PyInt_AsSsize_t(a3); if (step == -1 && PyErr_Occurred()) PyErr_Clear(); } if (step<1) { PyErr_SetString(PyExc_ValueError, "Step for islice() must be a positive integer or None."); return NULL; } /* Get iterator. */ it = PyObject_GetIter(seq); if (it == NULL) return NULL; /* create isliceobject structure */ lz = (isliceobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(it); return NULL; } lz->it = it; lz->next = start; lz->stop = stop; lz->step = step; lz->cnt = 0L; return (PyObject *)lz; } static void islice_dealloc(isliceobject *lz) { PyObject_GC_UnTrack(lz); Py_XDECREF(lz->it); lz->ob_type->tp_free(lz); } static int islice_traverse(isliceobject *lz, visitproc visit, void *arg) { Py_VISIT(lz->it); return 0; } static PyObject * islice_next(isliceobject *lz) { PyObject *item; PyObject *it = lz->it; Py_ssize_t oldnext; PyObject *(*iternext)(PyObject *); assert(PyIter_Check(it)); iternext = *it->ob_type->tp_iternext; while (lz->cnt < lz->next) { item = iternext(it); if (item == NULL) return NULL; Py_DECREF(item); lz->cnt++; } if (lz->stop != -1 && lz->cnt >= lz->stop) return NULL; assert(PyIter_Check(it)); item = iternext(it); if (item == NULL) return NULL; lz->cnt++; oldnext = lz->next; lz->next += lz->step; if (lz->next < oldnext) /* Check for overflow */ lz->next = lz->stop; return item; } PyDoc_STRVAR(islice_doc, "islice(iterable, [start,] stop [, step]) --> islice object\n\ \n\ Return an iterator whose next() method returns selected values from an\n\ iterable. If start is specified, will skip all preceding elements;\n\ otherwise, start defaults to zero. Step defaults to one. If\n\ specified as another value, step determines how many values are \n\ skipped between successive calls. Works like a slice() on a list\n\ but returns an iterator."); static PyTypeObject islice_type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "itertools.islice", /* tp_name */ sizeof(isliceobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)islice_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ islice_doc, /* tp_doc */ (traverseproc)islice_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)islice_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ islice_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ }; /* starmap object ************************************************************/ typedef struct { PyObject_HEAD PyObject *func; PyObject *it; } starmapobject; static PyTypeObject starmap_type; static PyObject * starmap_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *func, *seq; PyObject *it; starmapobject *lz; if (type == &starmap_type && !_PyArg_NoKeywords("starmap()", kwds)) return NULL; if (!PyArg_UnpackTuple(args, "starmap", 2, 2, &func, &seq)) return NULL; /* Get iterator. */ it = PyObject_GetIter(seq); if (it == NULL) return NULL; /* create starmapobject structure */ lz = (starmapobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(it); return NULL; } Py_INCREF(func); lz->func = func; lz->it = it; return (PyObject *)lz; } static void starmap_dealloc(starmapobject *lz) { PyObject_GC_UnTrack(lz); Py_XDECREF(lz->func); Py_XDECREF(lz->it); lz->ob_type->tp_free(lz); } static int starmap_traverse(starmapobject *lz, visitproc visit, void *arg) { Py_VISIT(lz->it); Py_VISIT(lz->func); return 0; } static PyObject * starmap_next(starmapobject *lz) { PyObject *args; PyObject *result; PyObject *it = lz->it; assert(PyIter_Check(it)); args = (*it->ob_type->tp_iternext)(it); if (args == NULL) return NULL; if (!PyTuple_CheckExact(args)) { Py_DECREF(args); PyErr_SetString(PyExc_TypeError, "iterator must return a tuple"); return NULL; } result = PyObject_Call(lz->func, args, NULL); Py_DECREF(args); return result; } PyDoc_STRVAR(starmap_doc, "starmap(function, sequence) --> starmap object\n\ \n\ Return an iterator whose values are returned from the function evaluated\n\ with a argument tuple taken from the given sequence."); static PyTypeObject starmap_type = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "itertools.starmap", /* tp_name */ sizeof(starmapobject), /* tp_basicsize */ 0, /* tp_itemsize */ /* methods */ (destructor)starmap_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */ starmap_doc, /* tp_doc */ (traverseproc)starmap_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)starmap_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ starmap_new, /* tp_new */ PyObject_GC_Del, /* tp_free */ }; /* imap object ************************************************************/ typedef struct { PyObject_HEAD PyObject *iters; PyObject *func; } imapobject; static PyTypeObject imap_type; static PyObject * imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *it, *iters, *func; imapobject *lz; Py_ssize_t numargs, i; if (type == &imap_type && !_PyArg_NoKeywords("imap()", kwds)) return NULL; numargs = PyTuple_Size(args); if (numargs < 2) { PyErr_SetString(PyExc_TypeError, "imap() must have at least two arguments."); return NULL; } iters = PyTuple_New(numargs-1); if (iters == NULL) return NULL; for (i=1 ; i<numargs ; i++) { /* Get iterator. */ it = PyObject_GetIter(PyTuple_GET_ITEM(args, i)); if (it == NULL) { Py_DECREF(iters); return NULL; } PyTuple_SET_ITEM(iters, i-1, it); } /* create imapobject structure */ lz = (imapobject *)type->tp_alloc(type, 0); if (lz == NULL) { Py_DECREF(iters); return NULL; } lz->iters = iters; func = PyTuple_GET_ITEM(args, 0); Py_INCREF(func); lz->func = func; return (PyObject *)lz; } static void imap_dealloc(imapobject *lz) { PyObject_GC_UnTrack(lz); Py_XDECREF(lz->iters); Py_XDECREF(lz->func); lz->ob_type->tp_free(lz); } static int imap_traverse(imapobject *lz, visitproc visit, void *arg) { Py_VISIT(lz->iters); Py_VISIT(lz->func); return 0; }