calliter_iternext() now uses fast call

Issue #27128: calliter_iternext() now calls _PyObject_FastCall() to avoid a
temporary empty tuple.

Cleanup also the code to reduce the indentation level.
This commit is contained in:
Victor Stinner 2016-08-19 18:47:10 +02:00
parent 6911267615
commit 99ee9c70a7
1 changed files with 21 additions and 19 deletions

View File

@ -208,30 +208,32 @@ calliter_traverse(calliterobject *it, visitproc visit, void *arg)
static PyObject * static PyObject *
calliter_iternext(calliterobject *it) calliter_iternext(calliterobject *it)
{ {
if (it->it_callable != NULL) { PyObject *result;
PyObject *args = PyTuple_New(0);
PyObject *result; if (it->it_callable == NULL) {
if (args == NULL) return NULL;
return NULL; }
result = PyObject_Call(it->it_callable, args, NULL);
Py_DECREF(args); result = _PyObject_FastCall(it->it_callable, NULL, 0, NULL);
if (result != NULL) { if (result != NULL) {
int ok; int ok;
ok = PyObject_RichCompareBool(it->it_sentinel, result, Py_EQ);
if (ok == 0) ok = PyObject_RichCompareBool(it->it_sentinel, result, Py_EQ);
return result; /* Common case, fast path */ if (ok == 0) {
Py_DECREF(result); return result; /* Common case, fast path */
if (ok > 0) {
Py_CLEAR(it->it_callable);
Py_CLEAR(it->it_sentinel);
}
} }
else if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
PyErr_Clear(); Py_DECREF(result);
if (ok > 0) {
Py_CLEAR(it->it_callable); Py_CLEAR(it->it_callable);
Py_CLEAR(it->it_sentinel); Py_CLEAR(it->it_sentinel);
} }
} }
else if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
PyErr_Clear();
Py_CLEAR(it->it_callable);
Py_CLEAR(it->it_sentinel);
}
return NULL; return NULL;
} }