[Python-checkins] python/nondist/sandbox/itertools itertools.c,1.17,1.18 test_itertools.py,1.11,1.12

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
Fri, 31 Jan 2003 00:53:17 -0800


Update of /cvsroot/python/python/nondist/sandbox/itertools
In directory sc8-pr-cvs1:/tmp/cvs-serv23128

Modified Files:
	itertools.c test_itertools.py 
Log Message:
Fix refcount leak in imap().

Index: itertools.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/itertools/itertools.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -d -r1.17 -r1.18
*** itertools.c	31 Jan 2003 07:20:49 -0000	1.17
--- itertools.c	31 Jan 2003 08:53:14 -0000	1.18
***************
*** 661,664 ****
--- 661,666 ----
  		}
  		PyTuple_SET_ITEM(iters, i-1, it);
+ 		Py_INCREF(Py_None);
+ 		PyTuple_SET_ITEM(argtuple, i-1, Py_None);
  	}
  
***************
*** 724,738 ****
  		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;
! 		PyTuple_SET_ITEM(argtuple, i, val);
! 	}
! 	if (lz->func == Py_None)
  		return argtuple;
! 	return PyObject_Call(lz->func, argtuple, NULL);
  }
  
--- 726,749 ----
  		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 {
! 		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);
! 	}
  }
  

Index: test_itertools.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/itertools/test_itertools.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** test_itertools.py	29 Jan 2003 19:08:08 -0000	1.11
--- test_itertools.py	31 Jan 2003 08:53:15 -0000	1.12
***************
*** 145,148 ****
--- 145,157 ----
      test_support.run_doctest(test_itertools, verbose)
  
+     # verify reference counting
+     import sys
+     if verbose and hasattr(sys, "gettotalrefcount"):
+         counts = []
+         for i in xrange(5):
+             test_support.run_suite(suite)
+             counts.append(sys.gettotalrefcount())
+         print counts
+ 
  if __name__ == "__main__":
      test_main(verbose=True)