diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-08-19 16:47:10 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-08-19 16:47:10 (GMT) |
commit | 99ee9c70a73ec2f3db68785821a9f2867c3f637f (patch) | |
tree | 4863d1e82980d64bcf9ecbfb6002f6e35c3c980a /Objects | |
parent | 6911267615ab805d555ef2b0a2458feebbc80d6d (diff) | |
download | cpython-99ee9c70a73ec2f3db68785821a9f2867c3f637f.zip cpython-99ee9c70a73ec2f3db68785821a9f2867c3f637f.tar.gz cpython-99ee9c70a73ec2f3db68785821a9f2867c3f637f.tar.bz2 |
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.
Diffstat (limited to 'Objects')
-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 ab29ff8..a8e6e1c 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; } |