diff options
| author | Victor Stinner <victor.stinner@gmail.com> | 2016-08-19 18:47:10 +0200 | 
|---|---|---|
| committer | Victor Stinner <victor.stinner@gmail.com> | 2016-08-19 18:47:10 +0200 | 
| commit | 99ee9c70a73ec2f3db68785821a9f2867c3f637f (patch) | |
| tree | 4863d1e82980d64bcf9ecbfb6002f6e35c3c980a | |
| parent | 6911267615ab805d555ef2b0a2458feebbc80d6d (diff) | |
| download | cpython-git-99ee9c70a73ec2f3db68785821a9f2867c3f637f.tar.gz | |
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.
| -rw-r--r-- | Objects/iterobject.c | 40 | 
1 files changed, 21 insertions, 19 deletions
diff --git a/Objects/iterobject.c b/Objects/iterobject.c index ab29ff81a9..a8e6e1c0c7 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;  }  | 
