https://github.com/python/cpython/commit/908f438e198a753d40d1166b5f8725e650a9ed6e
commit: 908f438e198a753d40d1166b5f8725e650a9ed6e
branch: main
author: Donghee Na <[email protected]>
committer: corona10 <[email protected]>
date: 2026-06-26T11:34:13+09:00
summary:
gh-152235: Defer GC tracking of set and frozenset to end of construction
(gh-152237)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2026-06-26-05-49-13.gh-issue-152235.YU20T9.rst
M Objects/setobject.c
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2026-06-26-05-49-13.gh-issue-152235.YU20T9.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-26-05-49-13.gh-issue-152235.YU20T9.rst
new file mode 100644
index 00000000000000..8d386ad458dfff
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2026-06-26-05-49-13.gh-issue-152235.YU20T9.rst
@@ -0,0 +1,2 @@
+Defer GC tracking of a :class:`set` or :class:`frozenset` to the end of its
+construction from iterable. Patch by Donghee Na.
diff --git a/Objects/setobject.c b/Objects/setobject.c
index d198794849f0d1..883658b8bfd340 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -1351,7 +1351,9 @@ make_new_set(PyTypeObject *type, PyObject *iterable)
assert(PyType_Check(type));
PySetObject *so;
- so = (PySetObject *)type->tp_alloc(type, 0);
+ // Allocate untracked: the fill below runs user code, and a half-built
+ // set must not be reachable from another thread via gc.get_objects().
+ so = (PySetObject *)_PyType_AllocNoTrack(type, 0);
if (so == NULL)
return NULL;
@@ -1370,6 +1372,8 @@ make_new_set(PyTypeObject *type, PyObject *iterable)
}
}
+ // Track only once fully built.
+ _PyObject_GC_TRACK(so);
return (PyObject *)so;
}
@@ -2885,7 +2889,7 @@ PyTypeObject PySet_Type = {
0, /* tp_descr_set */
0, /* tp_dictoffset */
set_init, /* tp_init */
- PyType_GenericAlloc, /* tp_alloc */
+ _PyType_AllocNoTrack, /* tp_alloc */
set_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
.tp_vectorcall = set_vectorcall,
@@ -2977,7 +2981,7 @@ PyTypeObject PyFrozenSet_Type = {
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
- PyType_GenericAlloc, /* tp_alloc */
+ _PyType_AllocNoTrack, /* tp_alloc */
frozenset_new, /* tp_new */
PyObject_GC_Del, /* tp_free */
.tp_vectorcall = frozenset_vectorcall,
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]