]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46085: Fix iterator cache mechanism of OrderedDict. (GH-30290)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 30 Dec 2021 05:29:19 +0000 (21:29 -0800)
committerGitHub <noreply@github.com>
Thu, 30 Dec 2021 05:29:19 +0000 (21:29 -0800)
(cherry picked from commit fb44d0589615590b1e7895ba78a038e96b15a219)

Co-authored-by: Dong-hee Na <donghee.na@python.org>
Misc/NEWS.d/next/Core and Builtins/2021-12-30-00-23-41.bpo-46085.bDuJqu.rst [new file with mode: 0644]
Objects/odictobject.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-12-30-00-23-41.bpo-46085.bDuJqu.rst b/Misc/NEWS.d/next/Core and Builtins/2021-12-30-00-23-41.bpo-46085.bDuJqu.rst
new file mode 100644 (file)
index 0000000..a2093f7
--- /dev/null
@@ -0,0 +1 @@
+Fix iterator cache mechanism of :class:`OrderedDict`.
index b9f2169a72a8ac2f04a77adc677bd7db7c9f3b3f..f3980aba93776d6896f3ae8f018a35ea358b81c2 100644 (file)
@@ -1290,6 +1290,7 @@ PyDoc_STRVAR(odict_reversed__doc__, "od.__reversed__() <==> reversed(od)");
 #define _odict_ITER_REVERSED 1
 #define _odict_ITER_KEYS 2
 #define _odict_ITER_VALUES 4
+#define _odict_ITER_ITEMS (_odict_ITER_KEYS|_odict_ITER_VALUES)
 
 /* forward */
 static PyObject * odictiter_new(PyODictObject *, int);
@@ -1708,7 +1709,7 @@ odictiter_dealloc(odictiterobject *di)
     _PyObject_GC_UNTRACK(di);
     Py_XDECREF(di->di_odict);
     Py_XDECREF(di->di_current);
-    if (di->kind & (_odict_ITER_KEYS | _odict_ITER_VALUES)) {
+    if ((di->kind & _odict_ITER_ITEMS) == _odict_ITER_ITEMS) {
         Py_DECREF(di->di_result);
     }
     PyObject_GC_Del(di);
@@ -1914,15 +1915,16 @@ odictiter_new(PyODictObject *od, int kind)
     if (di == NULL)
         return NULL;
 
-    if (kind & (_odict_ITER_KEYS | _odict_ITER_VALUES)){
+    if ((kind & _odict_ITER_ITEMS) == _odict_ITER_ITEMS) {
         di->di_result = PyTuple_Pack(2, Py_None, Py_None);
         if (di->di_result == NULL) {
             Py_DECREF(di);
             return NULL;
         }
     }
-    else
+    else {
         di->di_result = NULL;
+    }
 
     di->kind = kind;
     node = reversed ? _odict_LAST(od) : _odict_FIRST(od);