[Python-checkins] cpython: Factor out common iterator finalization code
raymond.hettinger
python-checkins at python.org
Sat Oct 3 02:17:40 EDT 2015
https://hg.python.org/cpython/rev/8c21f32c5882
changeset: 98508:8c21f32c5882
user: Raymond Hettinger <python at rcn.com>
date: Fri Oct 02 23:17:33 2015 -0700
summary:
Factor out common iterator finalization code
files:
Modules/_collectionsmodule.c | 45 ++++++++++-------------
1 files changed, 20 insertions(+), 25 deletions(-)
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -350,21 +350,34 @@
PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");
+static PyObject*
+finalize_iterator(PyObject *it)
+{
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else {
+ Py_DECREF(it);
+ return NULL;
+ }
+ }
+ Py_DECREF(it);
+ Py_RETURN_NONE;
+}
/* Run an iterator to exhaustion. Shortcut for
the extend/extendleft methods when maxlen == 0. */
static PyObject*
consume_iterator(PyObject *it)
{
+ PyObject *(*iternext)(PyObject *);
PyObject *item;
- while ((item = PyIter_Next(it)) != NULL) {
+ iternext = *Py_TYPE(it)->tp_iternext;
+ while ((item = iternext(it)) != NULL) {
Py_DECREF(item);
}
- Py_DECREF(it);
- if (PyErr_Occurred())
- return NULL;
- Py_RETURN_NONE;
+ return finalize_iterator(it);
}
static PyObject *
@@ -423,16 +436,7 @@
if (trim)
deque_trim_left(deque);
}
- if (PyErr_Occurred()) {
- if (PyErr_ExceptionMatches(PyExc_StopIteration))
- PyErr_Clear();
- else {
- Py_DECREF(it);
- return NULL;
- }
- }
- Py_DECREF(it);
- Py_RETURN_NONE;
+ return finalize_iterator(it);
}
PyDoc_STRVAR(extend_doc,
@@ -494,16 +498,7 @@
if (trim)
deque_trim_right(deque);
}
- if (PyErr_Occurred()) {
- if (PyErr_ExceptionMatches(PyExc_StopIteration))
- PyErr_Clear();
- else {
- Py_DECREF(it);
- return NULL;
- }
- }
- Py_DECREF(it);
- Py_RETURN_NONE;
+ return finalize_iterator(it);
}
PyDoc_STRVAR(extendleft_doc,
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list