cinap_lenrekadd hg and python4bb9e2215 years agoHistory
2550 lines · 57.3 KB · C
RawDownload
} 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