From 9c967611e3ef92f7aa605356c88027caa9dd9566 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 6 Nov 2015 10:39:51 +0200 Subject: Issue #25558: Refactoring OrderedDict iteration. --- Objects/odictobject.c | 71 ++++++++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/Objects/odictobject.c b/Objects/odictobject.c index 28537a8..7a3ded0 100644 --- a/Objects/odictobject.c +++ b/Objects/odictobject.c @@ -1829,7 +1829,7 @@ done: static PyObject * odictiter_iternext(odictiterobject *di) { - PyObject *value; + PyObject *result, *value; PyObject *key = odictiter_nextkey(di); /* new reference */ if (key == NULL) @@ -1840,53 +1840,44 @@ odictiter_iternext(odictiterobject *di) return key; } - /* Handle the items case. */ - if (di->kind & _odict_ITER_KEYS) { - PyObject *result = di->di_result; - - value = PyODict_GetItem((PyObject *)di->di_odict, key); /* borrowed */ - if (value == NULL) { - if (!PyErr_Occurred()) - PyErr_SetObject(PyExc_KeyError, key); - Py_DECREF(key); - goto done; - } - Py_INCREF(value); - - if (result->ob_refcnt == 1) { - /* not in use so we can reuse it - * (the common case during iteration) */ - Py_INCREF(result); - Py_DECREF(PyTuple_GET_ITEM(result, 0)); /* borrowed */ - Py_DECREF(PyTuple_GET_ITEM(result, 1)); /* borrowed */ - } - else { - result = PyTuple_New(2); - if (result == NULL) { - Py_DECREF(key); - Py_DECREF(value); - goto done; - } - } + value = PyODict_GetItem((PyObject *)di->di_odict, key); /* borrowed */ + if (value == NULL) { + if (!PyErr_Occurred()) + PyErr_SetObject(PyExc_KeyError, key); + Py_DECREF(key); + goto done; + } + Py_INCREF(value); - PyTuple_SET_ITEM(result, 0, key); /* steals reference */ - PyTuple_SET_ITEM(result, 1, value); /* steals reference */ + /* Handle the values case. */ + if (!(di->kind & _odict_ITER_KEYS)) { + Py_DECREF(key); + return value; + } - return result; + /* Handle the items case. */ + result = di->di_result; + + if (Py_REFCNT(result) == 1) { + /* not in use so we can reuse it + * (the common case during iteration) */ + Py_INCREF(result); + Py_DECREF(PyTuple_GET_ITEM(result, 0)); /* borrowed */ + Py_DECREF(PyTuple_GET_ITEM(result, 1)); /* borrowed */ } - /* Handle the values case. */ else { - value = PyODict_GetItem((PyObject *)di->di_odict, key); - Py_DECREF(key); - if (value == NULL) { - if (!PyErr_Occurred()) - PyErr_SetObject(PyExc_KeyError, key); + result = PyTuple_New(2); + if (result == NULL) { + Py_DECREF(key); + Py_DECREF(value); goto done; } - Py_INCREF(value); - return value; } + PyTuple_SET_ITEM(result, 0, key); /* steals reference */ + PyTuple_SET_ITEM(result, 1, value); /* steals reference */ + return result; + done: Py_CLEAR(di->di_current); Py_CLEAR(di->di_odict); -- cgit v0.12