mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	gh-111777: Fix assertion errors on incorrectly still-tracked GC object destruction (#111778)
In PyObject_GC_Del, in Py_DEBUG mode, when warning about GC objects that were not properly untracked before starting destruction, take care to untrack the object _before_ warning, to avoid triggering a GC run and causing the problem the code tries to warn about. Also make sure to save and restore any pending exceptions, which the warning would otherwise clobber or trigger an assertion error on.
This commit is contained in:
		
							parent
							
								
									21615f77b5
								
							
						
					
					
						commit
						ce6a533c4b
					
				
					 1 changed files with 3 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -2396,14 +2396,16 @@ 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)) {
 | 
			
		||||
        gc_list_remove(g);
 | 
			
		||||
#ifdef Py_DEBUG
 | 
			
		||||
        PyObject *exc = PyErr_GetRaisedException();
 | 
			
		||||
        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);
 | 
			
		||||
        }
 | 
			
		||||
        PyErr_SetRaisedException(exc);
 | 
			
		||||
#endif
 | 
			
		||||
        gc_list_remove(g);
 | 
			
		||||
    }
 | 
			
		||||
    GCState *gcstate = get_gc_state();
 | 
			
		||||
    if (gcstate->generations[0].count > 0) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue