--- /dev/null
+Emit a warning in debug mode if an object does not call
+:c:func:`PyObject_GC_UnTrack` before deallocation. Patch by Pablo Galindo.
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);
static void
PyCField_dealloc(PyObject *self)
{
+ PyObject_GC_UnTrack(self);
PyCField_clear((CFieldObject *)self);
Py_TYPE(self)->tp_free((PyObject *)self);
}
static void
lock_dealloc(lockobject *self)
{
+ PyObject_GC_UnTrack(self);
if (self->in_weakreflist != NULL) {
PyObject_ClearWeakRefs((PyObject *) self);
}
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
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();
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);
self = state->memerrors_freelist;
self->args = PyTuple_New(0);
/* This shouldn't happen since the empty tuple is persistent */
+
if (self->args == NULL) {
return NULL;
}
static void
MemoryError_dealloc(PyBaseExceptionObject *self)
{
+ _PyObject_GC_UNTRACK(self);
+
BaseException_clear(self);
/* If this is a subclass of MemoryError, we don't need to
return;
}
- _PyObject_GC_UNTRACK(self);
-
struct _Py_exc_state *state = get_exc_state();
if (state->memerrors_numfree >= MEMERRORS_SAVE) {
Py_TYPE(self)->tp_free((PyObject *)self);
static void
proxy_dealloc(PyWeakReference *self)
{
+ PyObject_GC_UnTrack(self);
if (self->wr_callback != NULL)
PyObject_GC_UnTrack((PyObject *)self);
clear_weakref(self);