diff options
author | Pablo Galindo Salgado <Pablogsal@gmail.com> | 2022-07-27 15:03:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-27 15:03:38 (GMT) |
commit | f40bc7fa49f8d137f9b38f7a14569e9a9bdbed07 (patch) | |
tree | 01f24798d6ac958feac40337a0a877ba60a66b5f /Modules | |
parent | 2833f3798dc3647e850b303a4d0fa00609a0ae9b (diff) | |
download | cpython-f40bc7fa49f8d137f9b38f7a14569e9a9bdbed07.zip cpython-f40bc7fa49f8d137f9b38f7a14569e9a9bdbed07.tar.gz cpython-f40bc7fa49f8d137f9b38f7a14569e9a9bdbed07.tar.bz2 |
gh-95324: Emit a warning if an object doesn't call PyObject_GC_UnTrack during deallocation in debug mode (#95325)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_abc.c | 1 | ||||
-rw-r--r-- | Modules/_ctypes/cfield.c | 1 | ||||
-rw-r--r-- | Modules/_threadmodule.c | 2 | ||||
-rw-r--r-- | Modules/gcmodule.c | 7 | ||||
-rw-r--r-- | Modules/xxlimited.c | 1 |
5 files changed, 12 insertions, 0 deletions
diff --git a/Modules/_abc.c b/Modules/_abc.c index 641d619..b22daa8 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -63,6 +63,7 @@ abc_data_clear(_abc_data *self) static void abc_data_dealloc(_abc_data *self) { + PyObject_GC_UnTrack(self); PyTypeObject *tp = Py_TYPE(self); (void)abc_data_clear(self); tp->tp_free(self); diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index c7234fb..13ed8b7 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -279,6 +279,7 @@ PyCField_clear(CFieldObject *self) static void PyCField_dealloc(PyObject *self) { + PyObject_GC_UnTrack(self); PyCField_clear((CFieldObject *)self); Py_TYPE(self)->tp_free((PyObject *)self); } diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index ace0282..4ac90dc 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -57,6 +57,7 @@ lock_traverse(lockobject *self, visitproc visit, void *arg) static void lock_dealloc(lockobject *self) { + PyObject_GC_UnTrack(self); if (self->in_weakreflist != NULL) { PyObject_ClearWeakRefs((PyObject *) self); } @@ -333,6 +334,7 @@ rlock_traverse(rlockobject *self, visitproc visit, void *arg) static void rlock_dealloc(rlockobject *self) { + PyObject_GC_UnTrack(self); if (self->in_weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); /* self->rlock_lock can be NULL if PyThread_allocate_lock() failed diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 3bda6e4..dcd46fe 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -2347,6 +2347,13 @@ PyObject_GC_Del(void *op) size_t presize = _PyType_PreHeaderSize(((PyObject *)op)->ob_type); PyGC_Head *g = AS_GC(op); if (_PyObject_GC_IS_TRACKED(op)) { +#ifdef Py_DEBUG + if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0, + "gc", NULL, "Object of type %s is not untracked before destruction", + ((PyObject*)op)->ob_type->tp_name)) { + PyErr_WriteUnraisable(NULL); + } +#endif gc_list_remove(g); } GCState *gcstate = get_gc_state(); diff --git a/Modules/xxlimited.c b/Modules/xxlimited.c index 5177ecd..e234504 100644 --- a/Modules/xxlimited.c +++ b/Modules/xxlimited.c @@ -138,6 +138,7 @@ Xxo_finalize(PyObject *self_obj) static void Xxo_dealloc(PyObject *self) { + PyObject_GC_UnTrack(self); Xxo_finalize(self); PyTypeObject *tp = Py_TYPE(self); freefunc free = PyType_GetSlot(tp, Py_tp_free); |