builtin_all(PyObject *self, PyObject *v)
{
PyObject *it, *item;
+ PyObject *(*iternext)(PyObject *);
+ int cmp;
it = PyObject_GetIter(v);
if (it == NULL)
return NULL;
+ iternext = *Py_TYPE(it)->tp_iternext;
- while ((item = PyIter_Next(it)) != NULL) {
- int cmp = PyObject_IsTrue(item);
+ for (;;) {
+ item = iternext(it);
+ if (item == NULL)
+ break;
+ cmp = PyObject_IsTrue(item);
Py_DECREF(item);
if (cmp < 0) {
Py_DECREF(it);
}
}
Py_DECREF(it);
- if (PyErr_Occurred())
- return NULL;
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
Py_RETURN_TRUE;
}
builtin_any(PyObject *self, PyObject *v)
{
PyObject *it, *item;
+ PyObject *(*iternext)(PyObject *);
+ int cmp;
it = PyObject_GetIter(v);
if (it == NULL)
return NULL;
+ iternext = *Py_TYPE(it)->tp_iternext;
- while ((item = PyIter_Next(it)) != NULL) {
- int cmp = PyObject_IsTrue(item);
+ for (;;) {
+ item = iternext(it);
+ if (item == NULL)
+ break;
+ cmp = PyObject_IsTrue(item);
Py_DECREF(item);
if (cmp < 0) {
Py_DECREF(it);
}
}
Py_DECREF(it);
- if (PyErr_Occurred())
- return NULL;
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
Py_RETURN_FALSE;
}