From 99ee9c70a73ec2f3db68785821a9f2867c3f637f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 19 Aug 2016 18:47:10 +0200 Subject: [PATCH] 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. --- Objects/iterobject.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/Objects/iterobject.c b/Objects/iterobject.c index ab29ff81a95..a8e6e1c0c75 100644 --- a/Objects/iterobject.c +++ b/Objects/iterobject.c @@ -208,30 +208,32 @@ calliter_traverse(calliterobject *it, visitproc visit, void *arg) static PyObject * calliter_iternext(calliterobject *it) { - if (it->it_callable != NULL) { - PyObject *args = PyTuple_New(0); - PyObject *result; - if (args == NULL) - return NULL; - result = PyObject_Call(it->it_callable, args, NULL); - Py_DECREF(args); - if (result != NULL) { - int ok; - ok = PyObject_RichCompareBool(it->it_sentinel, result, Py_EQ); - if (ok == 0) - return result; /* Common case, fast path */ - Py_DECREF(result); - if (ok > 0) { - Py_CLEAR(it->it_callable); - Py_CLEAR(it->it_sentinel); - } + PyObject *result; + + if (it->it_callable == NULL) { + return NULL; + } + + result = _PyObject_FastCall(it->it_callable, NULL, 0, NULL); + if (result != NULL) { + int ok; + + ok = PyObject_RichCompareBool(it->it_sentinel, result, Py_EQ); + if (ok == 0) { + return result; /* Common case, fast path */ } - else if (PyErr_ExceptionMatches(PyExc_StopIteration)) { - PyErr_Clear(); + + Py_DECREF(result); + if (ok > 0) { Py_CLEAR(it->it_callable); 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; }