summaryrefslogtreecommitdiffstats
path: root/Objects/dictobject.c
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@gmail.com>2020-12-05 03:45:57 (GMT)
committerGitHub <noreply@github.com>2020-12-05 03:45:57 (GMT)
commit226a012d1cd61f42ecd3056c554922f359a1a35d (patch)
tree86407049a5d2c22b0ce8626407ca106eb3c26afd /Objects/dictobject.c
parent2de5097ba4c50eba90df55696a7b2e74c93834d4 (diff)
downloadcpython-226a012d1cd61f42ecd3056c554922f359a1a35d.zip
cpython-226a012d1cd61f42ecd3056c554922f359a1a35d.tar.gz
cpython-226a012d1cd61f42ecd3056c554922f359a1a35d.tar.bz2
bpo-42536: GC track recycled tuples (GH-23623)
Several built-in and standard library types now ensure that their internal result tuples are always tracked by the garbage collector: - collections.OrderedDict.items - dict.items - enumerate - functools.reduce - itertools.combinations - itertools.combinations_with_replacement - itertools.permutations - itertools.product - itertools.zip_longest - zip Previously, they could have become untracked by a prior garbage collection.
Diffstat (limited to 'Objects/dictobject.c')
-rw-r--r--Objects/dictobject.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 7a37313..35e881f 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -3989,6 +3989,11 @@ dictiter_iternextitem(dictiterobject *di)
Py_INCREF(result);
Py_DECREF(oldkey);
Py_DECREF(oldvalue);
+ // bpo-42536: The GC may have untracked this result tuple. Since we're
+ // recycling it, make sure it's tracked again:
+ if (!_PyObject_GC_IS_TRACKED(result)) {
+ _PyObject_GC_TRACK(result);
+ }
}
else {
result = PyTuple_New(2);
@@ -4104,6 +4109,11 @@ dictreviter_iternext(dictiterobject *di)
Py_INCREF(result);
Py_DECREF(oldkey);
Py_DECREF(oldvalue);
+ // bpo-42536: The GC may have untracked this result tuple. Since
+ // we're recycling it, make sure it's tracked again:
+ if (!_PyObject_GC_IS_TRACKED(result)) {
+ _PyObject_GC_TRACK(result);
+ }
}
else {
result = PyTuple_New(2);