[Python-checkins] python/dist/src/Modules itertoolsmodule.c,1.2,1.3

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
Thu, 06 Feb 2003 23:26:27 -0800


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1:/tmp/cvs-serv1779

Modified Files:
	itertoolsmodule.c 
Log Message:
* Eliminated tuple re-use in imap().  Doing it correctly made the code
  too hard to read.
* Simplified previous changes to izip() to make it easier to read.


Index: itertoolsmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/itertoolsmodule.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** itertoolsmodule.c	7 Feb 2003 05:32:57 -0000	1.2
--- itertoolsmodule.c	7 Feb 2003 07:26:25 -0000	1.3
***************
*** 638,642 ****
  	PyObject_HEAD
  	PyObject *iters;
- 	PyObject *argtuple;
  	PyObject *func;
  } imapobject;
--- 638,641 ----
***************
*** 647,651 ****
  imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  {
! 	PyObject *it, *iters, *argtuple, *func;
  	imapobject *lz;
  	int numargs, i;
--- 646,650 ----
  imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  {
! 	PyObject *it, *iters, *func;
  	imapobject *lz;
  	int numargs, i;
***************
*** 662,682 ****
  		return NULL;
  
- 	argtuple = PyTuple_New(numargs-1);
- 	if (argtuple == NULL) {
- 		Py_DECREF(iters);
- 		return NULL;
- 	}
- 
  	for (i=1 ; i<numargs ; i++) {
  		/* Get iterator. */
  		it = PyObject_GetIter(PyTuple_GET_ITEM(args, i));
  		if (it == NULL) {
- 			Py_DECREF(argtuple);
  			Py_DECREF(iters);
  			return NULL;
  		}
  		PyTuple_SET_ITEM(iters, i-1, it);
- 		Py_INCREF(Py_None);
- 		PyTuple_SET_ITEM(argtuple, i-1, Py_None);
  	}
  
--- 661,672 ----
***************
*** 684,693 ****
  	lz = (imapobject *)type->tp_alloc(type, 0);
  	if (lz == NULL) {
- 		Py_DECREF(argtuple);
  		Py_DECREF(iters);
  		return NULL;
  	}
  	lz->iters = iters;
- 	lz->argtuple = argtuple;
  	func = PyTuple_GET_ITEM(args, 0);
  	Py_INCREF(func);
--- 674,681 ----
***************
*** 701,705 ****
  {
  	PyObject_GC_UnTrack(lz);
- 	Py_XDECREF(lz->argtuple);
  	Py_XDECREF(lz->iters);
  	Py_XDECREF(lz->func);
--- 689,692 ----
***************
*** 717,725 ****
  			return err;
  	}
- 	if (lz->argtuple) {
- 		err = visit(lz->argtuple, arg);
- 		if (err)
- 			return err;
- 	}
  	if (lz->func) {
  		err = visit(lz->func, arg);
--- 704,707 ----
***************
*** 759,795 ****
  {
  	PyObject *val;
! 	PyObject *argtuple=lz->argtuple;
  	int numargs, i;
  
  	numargs = PyTuple_Size(lz->iters);
! 	if (lz->func == Py_None) {
! 		argtuple = PyTuple_New(numargs);
! 		if (argtuple == NULL)
! 			return NULL;
  
! 		for (i=0 ; i<numargs ; i++) {
! 			val = PyIter_Next(PyTuple_GET_ITEM(lz->iters, i));
! 			if (val == NULL) {
! 				Py_DECREF(argtuple);
! 				return NULL;
! 			}
! 			PyTuple_SET_ITEM(argtuple, i, val);
! 		}
! 		return argtuple;
! 	} else {
! 		if (argtuple->ob_refcnt > 1) {
! 			argtuple = PyTuple_New(numargs);
! 			if (argtuple == NULL)
! 				return NULL;
! 		}
! 		for (i=0 ; i<numargs ; i++) {
! 			val = PyIter_Next(PyTuple_GET_ITEM(lz->iters, i));
! 			if (val == NULL)
! 				return NULL;
! 			Py_DECREF(PyTuple_GET_ITEM(argtuple, i));
! 			PyTuple_SET_ITEM(argtuple, i, val);
  		}
! 		return PyObject_Call(lz->func, argtuple, NULL);
  	}
  }
  
--- 741,766 ----
  {
  	PyObject *val;
! 	PyObject *argtuple;
! 	PyObject *result;
  	int numargs, i;
  
  	numargs = PyTuple_Size(lz->iters);
! 	argtuple = PyTuple_New(numargs);
! 	if (argtuple == NULL)
! 		return NULL;
  
! 	for (i=0 ; i<numargs ; i++) {
! 		val = PyIter_Next(PyTuple_GET_ITEM(lz->iters, i));
! 		if (val == NULL) {
! 			Py_DECREF(argtuple);
! 			return NULL;
  		}
! 		PyTuple_SET_ITEM(argtuple, i, val);
  	}
+ 	if (lz->func == Py_None) 
+ 		return argtuple;
+ 	result = PyObject_Call(lz->func, argtuple, NULL);
+ 	Py_DECREF(argtuple);
+ 	return result;
  }
  
***************
*** 1332,1361 ****
  	PyObject *item;
  
- 	assert(result->ob_refcnt >= 1);
  	if (result->ob_refcnt == 1) {
  		for (i=0 ; i < tuplesize ; i++) {
  			Py_DECREF(PyTuple_GET_ITEM(result, i));
! 			PyTuple_SET_ITEM(result, i, NULL);
  		}
  		Py_INCREF(result);
  	} else {
- 		Py_DECREF(result);
  		result = PyTuple_New(tuplesize);
  		if (result == NULL)
  			return NULL;
! 		Py_INCREF(result);
! 		lz->result = result;
! 	}
! 	assert(lz->result == result);
! 	assert(result->ob_refcnt == 2);
! 
! 	for (i=0 ; i < tuplesize ; i++) {
! 		it = PyTuple_GET_ITEM(lz->ittuple, i);
! 		item = PyIter_Next(it);
! 		if (item == NULL) {
! 			Py_DECREF(result);
! 			return NULL;
  		}
- 		PyTuple_SET_ITEM(result, i, item);
  	}
  	return result;
--- 1303,1329 ----
  	PyObject *item;
  
  	if (result->ob_refcnt == 1) {
  		for (i=0 ; i < tuplesize ; i++) {
+ 			it = PyTuple_GET_ITEM(lz->ittuple, i);
+ 			item = PyIter_Next(it);
+ 			if (item == NULL)
+ 				return NULL;
  			Py_DECREF(PyTuple_GET_ITEM(result, i));
! 			PyTuple_SET_ITEM(result, i, item);
  		}
  		Py_INCREF(result);
  	} else {
  		result = PyTuple_New(tuplesize);
  		if (result == NULL)
  			return NULL;
! 		for (i=0 ; i < tuplesize ; i++) {
! 			it = PyTuple_GET_ITEM(lz->ittuple, i);
! 			item = PyIter_Next(it);
! 			if (item == NULL) {
! 				Py_DECREF(result);
! 				return NULL;
! 			}
! 			PyTuple_SET_ITEM(result, i, item);
  		}
  	}
  	return result;