[Python-checkins] bpo-46085: Fix iterator cache mechanism of OrderedDict. (GH-30290)
corona10
webhook-mailer at python.org
Wed Dec 29 22:36:06 EST 2021
https://github.com/python/cpython/commit/fb44d0589615590b1e7895ba78a038e96b15a219
commit: fb44d0589615590b1e7895ba78a038e96b15a219
branch: main
author: Dong-hee Na <donghee.na at python.org>
committer: corona10 <donghee.na92 at gmail.com>
date: 2021-12-30T12:35:45+09:00
summary:
bpo-46085: Fix iterator cache mechanism of OrderedDict. (GH-30290)
files:
A Misc/NEWS.d/next/Core and Builtins/2021-12-30-00-23-41.bpo-46085.bDuJqu.rst
M 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
index 0000000000000..a2093f75c3b62
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-12-30-00-23-41.bpo-46085.bDuJqu.rst
@@ -0,0 +1 @@
+Fix iterator cache mechanism of :class:`OrderedDict`.
diff --git a/Objects/odictobject.c b/Objects/odictobject.c
index 9af45c685ab3b..e27bcecd75ca3 100644
--- a/Objects/odictobject.c
+++ b/Objects/odictobject.c
@@ -1249,6 +1249,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);
@@ -1666,7 +1667,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);
@@ -1872,15 +1873,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);
More information about the Python-checkins
mailing list