mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 13a00078b8
			
		
	
	
		13a00078b8
		
			
		
	
	
	
	
		
			
			Python built with "configure --with-trace-refs" (tracing references) is now ABI compatible with Python release build and debug build. Moreover, it now also supports the Limited API. Change Py_TRACE_REFS build: * Remove _PyObject_EXTRA_INIT macro. * The PyObject structure no longer has two extra members (_ob_prev and _ob_next). * Use a hash table (_Py_hashtable_t) to trace references (all objects): PyInterpreterState.object_state.refchain. * Py_TRACE_REFS build is now ABI compatible with release build and debug build. * Limited C API extensions can now be built with Py_TRACE_REFS: xxlimited, xxlimited_35, _testclinic_limited. * No longer rename PyModule_Create2() and PyModule_FromDefAndSpec2() functions to PyModule_Create2TraceRefs() and PyModule_FromDefAndSpec2TraceRefs(). * _Py_PrintReferenceAddresses() is now called before finalize_interp_delete() which deletes the refchain hash table. * test_tracemalloc find_trace() now also filters by size to ignore the memory allocated by _PyRefchain_Trace(). Test changes for Py_TRACE_REFS: * Add test.support.Py_TRACE_REFS constant. * Add test_sys.test_getobjects() to test sys.getobjects() function. * test_exceptions skips test_recursion_normalizing_with_no_memory() and test_memory_error_in_PyErr_PrintEx() if Python is built with Py_TRACE_REFS. * test_repl skips test_no_memory(). * test_capi skisp test_set_nomemory().
		
			
				
	
	
		
			37 lines
		
	
	
	
		
			805 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
	
		
			805 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef Py_INTERNAL_OBJECT_STATE_H
 | |
| #define Py_INTERNAL_OBJECT_STATE_H
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #ifndef Py_BUILD_CORE
 | |
| #  error "this header requires Py_BUILD_CORE define"
 | |
| #endif
 | |
| 
 | |
| #include "pycore_hashtable.h"     // _Py_hashtable_t
 | |
| 
 | |
| struct _py_object_runtime_state {
 | |
| #ifdef Py_REF_DEBUG
 | |
|     Py_ssize_t interpreter_leaks;
 | |
| #endif
 | |
|     int _not_used;
 | |
| };
 | |
| 
 | |
| struct _py_object_state {
 | |
| #ifdef Py_REF_DEBUG
 | |
|     Py_ssize_t reftotal;
 | |
| #endif
 | |
| #ifdef Py_TRACE_REFS
 | |
|     // Hash table storing all objects. The key is the object pointer
 | |
|     // (PyObject*) and the value is always the number 1 (as uintptr_t).
 | |
|     // See _PyRefchain_IsTraced() and _PyRefchain_Trace() functions.
 | |
|     _Py_hashtable_t *refchain;
 | |
| #endif
 | |
|     int _not_used;
 | |
| };
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| #endif /* !Py_INTERNAL_OBJECT_STATE_H */
 |