[Python-checkins] python/dist/src/Objects enumobject.c,1.6,1.7

rhettinger@users.sourceforge.net rhettinger@users.sourceforge.net
Wed, 28 May 2003 07:05:37 -0700


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

Modified Files:
	enumobject.c 
Log Message:
* Beefed-up tests
* Allow tuple re-use
* Call tp_iternext directly



Index: enumobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/enumobject.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** enumobject.c	21 Apr 2003 20:26:25 -0000	1.6
--- enumobject.c	28 May 2003 14:05:34 -0000	1.7
***************
*** 7,10 ****
--- 7,11 ----
  	long      en_index;        /* current index of enumeration */
  	PyObject* en_sit;          /* secondary iterator of enumeration */
+ 	PyObject* en_result;	   /* result tuple  */
  } enumobject;
  
***************
*** 31,34 ****
--- 32,45 ----
  		return NULL;
  	}
+ 	en->en_result = PyTuple_New(2);
+ 	if (en->en_result == NULL) {
+ 		Py_DECREF(en->en_sit);
+ 		Py_DECREF(en);
+ 		return NULL;
+ 	}
+ 	Py_INCREF(Py_None);
+ 	PyTuple_SET_ITEM(en->en_result, 0, Py_None);
+ 	Py_INCREF(Py_None);
+ 	PyTuple_SET_ITEM(en->en_result, 1, Py_None);
  	return (PyObject *)en;
  }
***************
*** 39,42 ****
--- 50,54 ----
  	PyObject_GC_UnTrack(en);
  	Py_XDECREF(en->en_sit);
+ 	Py_XDECREF(en->en_result);
  	en->ob_type->tp_free(en);
  }
***************
*** 45,50 ****
  enum_traverse(enumobject *en, visitproc visit, void *arg)
  {
! 	if (en->en_sit)
! 		return visit(en->en_sit, arg);
  	return 0;
  }
--- 57,72 ----
  enum_traverse(enumobject *en, visitproc visit, void *arg)
  {
! 	int err;
! 
! 	if (en->en_sit) {
! 		err = visit(en->en_sit, arg);
! 		if (err)
! 			return err;
! 	}
! 	if (en->en_result) {
! 		err = visit(en->en_result, arg);
! 		if (err)
! 			return err;
! 	}
  	return 0;
  }
***************
*** 53,78 ****
  enum_next(enumobject *en)
  {
- 	PyObject *result;
  	PyObject *next_index;
  	PyObject *next_item;
  
! 	result = PyTuple_New(2);
! 	if (result == NULL)
  		return NULL;
  
  	next_index = PyInt_FromLong(en->en_index);
  	if (next_index == NULL) {
! 		Py_DECREF(result);
  		return NULL;
  	}
! 	PyTuple_SET_ITEM(result, 0, next_index);
  
! 	next_item = PyIter_Next(en->en_sit);
! 	if (next_item == NULL) {
! 		Py_DECREF(result);
! 		return NULL;
  	}
! 
! 	en->en_index++;
  	PyTuple_SET_ITEM(result, 1, next_item);
  	return result;
--- 75,107 ----
  enum_next(enumobject *en)
  {
  	PyObject *next_index;
  	PyObject *next_item;
+ 	PyObject *result = en->en_result;
+ 	PyObject *it = en->en_sit;
  
! 	next_item = (*it->ob_type->tp_iternext)(it);
! 	if (next_item == NULL)
  		return NULL;
  
  	next_index = PyInt_FromLong(en->en_index);
  	if (next_index == NULL) {
! 		Py_DECREF(next_item);
  		return NULL;
  	}
! 	en->en_index++;
  
! 	if (result->ob_refcnt == 1) {
! 		Py_INCREF(result);
! 		Py_DECREF(PyTuple_GET_ITEM(result, 0));
! 		Py_DECREF(PyTuple_GET_ITEM(result, 1));
! 	} else {
! 		result = PyTuple_New(2);
! 		if (result == NULL) {
! 			Py_DECREF(next_index);
! 			Py_DECREF(next_item);
! 			return NULL;
! 		}
  	}
! 	PyTuple_SET_ITEM(result, 0, next_index);
  	PyTuple_SET_ITEM(result, 1, next_item);
  	return result;