[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;