summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@gmail.com>2020-10-15 01:44:07 (GMT)
committerGitHub <noreply@github.com>2020-10-15 01:44:07 (GMT)
commitc13b847a6f913b72eeb71651ff626390b738d973 (patch)
treeb5cc26798d51fd3a93fd8cea1c5177fba49ddd94 /Objects
parent302b6166fbb15c51f58b040c62e987d486742189 (diff)
downloadcpython-c13b847a6f913b72eeb71651ff626390b738d973.zip
cpython-c13b847a6f913b72eeb71651ff626390b738d973.tar.gz
cpython-c13b847a6f913b72eeb71651ff626390b738d973.tar.bz2
bpo-41984: GC track all user classes (GH-22701)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 3bb2c33..36c7662 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -2612,10 +2612,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
slots = NULL;
/* Initialize tp_flags */
+ // All heap types need GC, since we can create a reference cycle by storing
+ // an instance on one of its parents:
type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
- Py_TPFLAGS_BASETYPE;
- if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
- type->tp_flags |= Py_TPFLAGS_HAVE_GC;
+ Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC;
/* Initialize essential fields */
type->tp_as_async = &et->as_async;
@@ -2815,21 +2815,11 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
}
type->tp_dealloc = subtype_dealloc;
- /* Enable GC unless this class is not adding new instance variables and
- the base class did not use GC. */
- if ((base->tp_flags & Py_TPFLAGS_HAVE_GC) ||
- type->tp_basicsize > base->tp_basicsize)
- type->tp_flags |= Py_TPFLAGS_HAVE_GC;
-
/* Always override allocation strategy to use regular heap */
type->tp_alloc = PyType_GenericAlloc;
- if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
- type->tp_free = PyObject_GC_Del;
- type->tp_traverse = subtype_traverse;
- type->tp_clear = subtype_clear;
- }
- else
- type->tp_free = PyObject_Del;
+ type->tp_free = PyObject_GC_Del;
+ type->tp_traverse = subtype_traverse;
+ type->tp_clear = subtype_clear;
/* store type in class' cell if one is supplied */
cell = _PyDict_GetItemIdWithError(dict, &PyId___classcell__);