diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-05-05 00:14:56 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-05-05 00:14:56 (GMT) |
commit | f4848dac41689d1f2f8bd224bd935beae9b8df86 (patch) | |
tree | c4b33c842f923add9fde5d8e4a4619ab6b0c316b /Python | |
parent | 648b4de3d31aab9df142540919accf0cb518e2f3 (diff) | |
download | cpython-f4848dac41689d1f2f8bd224bd935beae9b8df86.zip cpython-f4848dac41689d1f2f8bd224bd935beae9b8df86.tar.gz cpython-f4848dac41689d1f2f8bd224bd935beae9b8df86.tar.bz2 |
Make PyIter_Next() a little smarter (wrt its knowledge of iterator
internals) so clients can be a lot dumber (wrt their knowledge).
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 61 | ||||
-rw-r--r-- | Python/ceval.c | 8 |
2 files changed, 17 insertions, 52 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 5209607..4a51ccd 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -164,7 +164,7 @@ builtin_filter(PyObject *self, PyObject *args) { PyObject *func, *seq, *result, *it; int len; /* guess for result list size */ - register int i, j; + register int j; if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq)) return NULL; @@ -204,22 +204,15 @@ builtin_filter(PyObject *self, PyObject *args) } /* Build the result list. */ - for (i = j = 0; ; ++i) { + j = 0; + for (;;) { PyObject *item, *good; int ok; item = PyIter_Next(it); if (item == NULL) { - /* We're out of here in any case, but if this is a - * StopIteration exception it's expected, but if - * any other kind of exception it's an error. - */ - if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) - PyErr_Clear(); - else - goto Fail_result_it; - } + if (PyErr_Occurred()) + goto Fail_result_it; break; } @@ -1030,24 +1023,14 @@ builtin_map(PyObject *self, PyObject *args) if (item) ++numactive; else { - /* StopIteration is *implied* by a - * NULL return from PyIter_Next() if - * PyErr_Occurred() is false. - */ if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches( - PyExc_StopIteration)) - PyErr_Clear(); - else { - Py_XDECREF(alist); - goto Fail_1; - } + Py_XDECREF(alist); + goto Fail_1; } Py_INCREF(Py_None); item = Py_None; sqp->saw_StopIteration = 1; } - } if (alist) PyTuple_SET_ITEM(alist, j, item); @@ -1445,7 +1428,6 @@ Return the dictionary containing the current scope's local variables."; static PyObject * min_max(PyObject *args, int op) { - int i; PyObject *v, *w, *x, *it; if (PyTuple_Size(args) > 1) @@ -1458,21 +1440,13 @@ min_max(PyObject *args, int op) return NULL; w = NULL; /* the result */ - for (i = 0; ; i++) { + for (;;) { x = PyIter_Next(it); if (x == NULL) { - /* We're out of here in any case, but if this is a - * StopIteration exception it's expected, but if - * any other kind of exception it's an error. - */ if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) - PyErr_Clear(); - else { - Py_XDECREF(w); - Py_DECREF(it); - return NULL; - } + Py_XDECREF(w); + Py_DECREF(it); + return NULL; } break; } @@ -1880,16 +1854,9 @@ builtin_reduce(PyObject *self, PyObject *args) op2 = PyIter_Next(it); if (op2 == NULL) { - /* StopIteration is *implied* by a NULL return from - * PyIter_Next() if PyErr_Occurred() is false. - */ - if (PyErr_Occurred()) { - if (PyErr_ExceptionMatches(PyExc_StopIteration)) - PyErr_Clear(); - else - goto Fail; - } - break; + if (PyErr_Occurred()) + goto Fail; + break; } if (result == NULL) diff --git a/Python/ceval.c b/Python/ceval.c index df160f2..0cdd019 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1894,11 +1894,9 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals, PUSH(x); continue; } - if (!PyErr_Occurred() || - PyErr_ExceptionMatches( - PyExc_StopIteration)) - { - x = v = POP(); + if (!PyErr_Occurred()) { + /* iterator ended normally */ + x = v = POP(); Py_DECREF(v); JUMPBY(oparg); continue; |