Skip to content

Commit 2d4049d

Browse files
bpo-46085: Fix iterator cache mechanism of OrderedDict. (GH-30290)
(cherry picked from commit fb44d05) Co-authored-by: Dong-hee Na <[email protected]>
1 parent 864caaa commit 2d4049d

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix iterator cache mechanism of :class:`OrderedDict`.

Objects/odictobject.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,6 +1290,7 @@ PyDoc_STRVAR(odict_reversed__doc__, "od.__reversed__() <==> reversed(od)");
12901290
#define _odict_ITER_REVERSED 1
12911291
#define _odict_ITER_KEYS 2
12921292
#define _odict_ITER_VALUES 4
1293+
#define _odict_ITER_ITEMS (_odict_ITER_KEYS|_odict_ITER_VALUES)
12931294

12941295
/* forward */
12951296
static PyObject * odictiter_new(PyODictObject *, int);
@@ -1708,7 +1709,7 @@ odictiter_dealloc(odictiterobject *di)
17081709
_PyObject_GC_UNTRACK(di);
17091710
Py_XDECREF(di->di_odict);
17101711
Py_XDECREF(di->di_current);
1711-
if (di->kind & (_odict_ITER_KEYS | _odict_ITER_VALUES)) {
1712+
if ((di->kind & _odict_ITER_ITEMS) == _odict_ITER_ITEMS) {
17121713
Py_DECREF(di->di_result);
17131714
}
17141715
PyObject_GC_Del(di);
@@ -1914,15 +1915,16 @@ odictiter_new(PyODictObject *od, int kind)
19141915
if (di == NULL)
19151916
return NULL;
19161917

1917-
if (kind & (_odict_ITER_KEYS | _odict_ITER_VALUES)){
1918+
if ((kind & _odict_ITER_ITEMS) == _odict_ITER_ITEMS) {
19181919
di->di_result = PyTuple_Pack(2, Py_None, Py_None);
19191920
if (di->di_result == NULL) {
19201921
Py_DECREF(di);
19211922
return NULL;
19221923
}
19231924
}
1924-
else
1925+
else {
19251926
di->di_result = NULL;
1927+
}
19261928

19271929
di->kind = kind;
19281930
node = reversed ? _odict_LAST(od) : _odict_FIRST(od);

0 commit comments

Comments
 (0)