mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	GH-131238: More refactoring of core header files (GH-131351)
Adds new pycore_stats.h header file to help break dependencies involving the pycore_code.h header.
This commit is contained in:
		
							parent
							
								
									bb0268f60d
								
							
						
					
					
						commit
						a45f25361d
					
				
					 51 changed files with 264 additions and 187 deletions
				
			
		|  | @ -9,6 +9,7 @@ extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include "pycore_pystate.h"       // _PyThreadState_GET() | #include "pycore_pystate.h"       // _PyThreadState_GET() | ||||||
|  | #include "pycore_stats.h" | ||||||
| 
 | 
 | ||||||
| /* Suggested size (number of positional arguments) for arrays of PyObject*
 | /* Suggested size (number of positional arguments) for arrays of PyObject*
 | ||||||
|    allocated on a C stack to avoid allocating memory on the heap memory. Such |    allocated on a C stack to avoid allocating memory on the heap memory. Such | ||||||
|  |  | ||||||
|  | @ -318,68 +318,6 @@ extern void _Py_Specialize_Send(_PyStackRef receiver, _Py_CODEUNIT *instr); | ||||||
| extern void _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr); | extern void _Py_Specialize_ToBool(_PyStackRef value, _Py_CODEUNIT *instr); | ||||||
| extern void _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr); | extern void _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr); | ||||||
| 
 | 
 | ||||||
| #ifdef Py_STATS |  | ||||||
| 
 |  | ||||||
| #include "pycore_bitutils.h"  // _Py_bit_length |  | ||||||
| 
 |  | ||||||
| #define STAT_INC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name++; } while (0) |  | ||||||
| #define STAT_DEC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name--; } while (0) |  | ||||||
| #define OPCODE_EXE_INC(opname) do { if (_Py_stats) _Py_stats->opcode_stats[opname].execution_count++; } while (0) |  | ||||||
| #define CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.name++; } while (0) |  | ||||||
| #define OBJECT_STAT_INC(name) do { if (_Py_stats) _Py_stats->object_stats.name++; } while (0) |  | ||||||
| #define OBJECT_STAT_INC_COND(name, cond) \ |  | ||||||
|     do { if (_Py_stats && cond) _Py_stats->object_stats.name++; } while (0) |  | ||||||
| #define EVAL_CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.eval_calls[name]++; } while (0) |  | ||||||
| #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) \ |  | ||||||
|     do { if (_Py_stats && PyFunction_Check(callable)) _Py_stats->call_stats.eval_calls[name]++; } while (0) |  | ||||||
| #define GC_STAT_ADD(gen, name, n) do { if (_Py_stats) _Py_stats->gc_stats[(gen)].name += (n); } while (0) |  | ||||||
| #define OPT_STAT_INC(name) do { if (_Py_stats) _Py_stats->optimization_stats.name++; } while (0) |  | ||||||
| #define OPT_STAT_ADD(name, n) do { if (_Py_stats) _Py_stats->optimization_stats.name += (n); } while (0) |  | ||||||
| #define UOP_STAT_INC(opname, name) do { if (_Py_stats) { assert(opname < 512); _Py_stats->optimization_stats.opcode[opname].name++; } } while (0) |  | ||||||
| #define UOP_PAIR_INC(uopcode, lastuop)                                              \ |  | ||||||
|     do {                                                                            \ |  | ||||||
|         if (lastuop && _Py_stats) {                                                 \ |  | ||||||
|             _Py_stats->optimization_stats.opcode[lastuop].pair_count[uopcode]++;    \ |  | ||||||
|         }                                                                           \ |  | ||||||
|         lastuop = uopcode;                                                          \ |  | ||||||
|     } while (0) |  | ||||||
| #define OPT_UNSUPPORTED_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.unsupported_opcode[opname]++; } while (0) |  | ||||||
| #define OPT_ERROR_IN_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.error_in_opcode[opname]++; } while (0) |  | ||||||
| #define OPT_HIST(length, name) \ |  | ||||||
|     do { \ |  | ||||||
|         if (_Py_stats) { \ |  | ||||||
|             int bucket = _Py_bit_length(length >= 1 ? length - 1 : 0); \ |  | ||||||
|             bucket = (bucket >= _Py_UOP_HIST_SIZE) ? _Py_UOP_HIST_SIZE - 1 : bucket; \ |  | ||||||
|             _Py_stats->optimization_stats.name[bucket]++; \ |  | ||||||
|         } \ |  | ||||||
|     } while (0) |  | ||||||
| #define RARE_EVENT_STAT_INC(name) do { if (_Py_stats) _Py_stats->rare_event_stats.name++; } while (0) |  | ||||||
| #define OPCODE_DEFERRED_INC(opname) do { if (_Py_stats && opcode == opname) _Py_stats->opcode_stats[opname].specialization.deferred++; } while (0) |  | ||||||
| 
 |  | ||||||
| // Export for '_opcode' shared extension
 |  | ||||||
| PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); |  | ||||||
| 
 |  | ||||||
| #else |  | ||||||
| #define STAT_INC(opname, name) ((void)0) |  | ||||||
| #define STAT_DEC(opname, name) ((void)0) |  | ||||||
| #define OPCODE_EXE_INC(opname) ((void)0) |  | ||||||
| #define CALL_STAT_INC(name) ((void)0) |  | ||||||
| #define OBJECT_STAT_INC(name) ((void)0) |  | ||||||
| #define OBJECT_STAT_INC_COND(name, cond) ((void)0) |  | ||||||
| #define EVAL_CALL_STAT_INC(name) ((void)0) |  | ||||||
| #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) ((void)0) |  | ||||||
| #define GC_STAT_ADD(gen, name, n) ((void)0) |  | ||||||
| #define OPT_STAT_INC(name) ((void)0) |  | ||||||
| #define OPT_STAT_ADD(name, n) ((void)0) |  | ||||||
| #define UOP_STAT_INC(opname, name) ((void)0) |  | ||||||
| #define UOP_PAIR_INC(uopcode, lastuop) ((void)0) |  | ||||||
| #define OPT_UNSUPPORTED_OPCODE(opname) ((void)0) |  | ||||||
| #define OPT_ERROR_IN_OPCODE(opname) ((void)0) |  | ||||||
| #define OPT_HIST(length, name) ((void)0) |  | ||||||
| #define RARE_EVENT_STAT_INC(name) ((void)0) |  | ||||||
| #define OPCODE_DEFERRED_INC(opname) ((void)0) |  | ||||||
| #endif  // !Py_STATS
 |  | ||||||
| 
 |  | ||||||
| // Utility functions for reading/writing 32/64-bit values in the inline caches.
 | // Utility functions for reading/writing 32/64-bit values in the inline caches.
 | ||||||
| // Great care should be taken to ensure that these functions remain correct and
 | // Great care should be taken to ensure that these functions remain correct and
 | ||||||
| // performant! They should compile to just "move" instructions on all supported
 | // performant! They should compile to just "move" instructions on all supported
 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ extern "C" { | ||||||
| #include "pycore_object.h"               // PyManagedDictPointer | #include "pycore_object.h"               // PyManagedDictPointer | ||||||
| #include "pycore_pyatomic_ft_wrappers.h" // FT_ATOMIC_LOAD_SSIZE_ACQUIRE | #include "pycore_pyatomic_ft_wrappers.h" // FT_ATOMIC_LOAD_SSIZE_ACQUIRE | ||||||
| #include "pycore_stackref.h"             // _PyStackRef | #include "pycore_stackref.h"             // _PyStackRef | ||||||
|  | #include "pycore_stats.h" | ||||||
| 
 | 
 | ||||||
| // Unsafe flavor of PyDict_GetItemWithError(): no error checking
 | // Unsafe flavor of PyDict_GetItemWithError(): no error checking
 | ||||||
| extern PyObject* _PyDict_GetItemWithError(PyObject *dp, PyObject *key); | extern PyObject* _PyDict_GetItemWithError(PyObject *dp, PyObject *key); | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ extern "C" { | ||||||
| #include <stddef.h>               // offsetof() | #include <stddef.h>               // offsetof() | ||||||
| #include "pycore_code.h"          // STATS | #include "pycore_code.h"          // STATS | ||||||
| #include "pycore_stackref.h"      // _PyStackRef | #include "pycore_stackref.h"      // _PyStackRef | ||||||
|  | #include "pycore_stats.h" | ||||||
| 
 | 
 | ||||||
| /* See InternalDocs/frames.md for an explanation of the frame stack
 | /* See InternalDocs/frames.md for an explanation of the frame stack
 | ||||||
|  * including explanation of the PyFrameObject and _PyInterpreterFrame |  * including explanation of the PyFrameObject and _PyInterpreterFrame | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ extern "C" { | ||||||
| #include "pycore_freelist_state.h"      // struct _Py_freelists | #include "pycore_freelist_state.h"      // struct _Py_freelists | ||||||
| #include "pycore_object.h"              // _PyObject_IS_GC | #include "pycore_object.h"              // _PyObject_IS_GC | ||||||
| #include "pycore_pystate.h"             // _PyThreadState_GET | #include "pycore_pystate.h"             // _PyThreadState_GET | ||||||
| #include "pycore_code.h"                // OBJECT_STAT_INC | #include "pycore_stats.h"               // OBJECT_STAT_INC | ||||||
| 
 | 
 | ||||||
| static inline struct _Py_freelists * | static inline struct _Py_freelists * | ||||||
| _Py_freelists_GET(void) | _Py_freelists_GET(void) | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include "pycore_runtime_structs.h" | #include "pycore_runtime_structs.h" | ||||||
|  | #include "pycore_pystate.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Get an object's GC head */ | /* Get an object's GC head */ | ||||||
|  | @ -203,6 +204,86 @@ static inline void _PyGC_CLEAR_FINALIZED(PyObject *op) { | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | /* Tell the GC to track this object.
 | ||||||
|  |  * | ||||||
|  |  * The object must not be tracked by the GC. | ||||||
|  |  * | ||||||
|  |  * NB: While the object is tracked by the collector, it must be safe to call the | ||||||
|  |  * ob_traverse method. | ||||||
|  |  * | ||||||
|  |  * Internal note: interp->gc.generation0->_gc_prev doesn't have any bit flags | ||||||
|  |  * because it's not object header.  So we don't use _PyGCHead_PREV() and | ||||||
|  |  * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. | ||||||
|  |  * | ||||||
|  |  * See also the public PyObject_GC_Track() function. | ||||||
|  |  */ | ||||||
|  | static inline void _PyObject_GC_TRACK( | ||||||
|  | // The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined
 | ||||||
|  | #ifndef NDEBUG | ||||||
|  |     const char *filename, int lineno, | ||||||
|  | #endif | ||||||
|  |     PyObject *op) | ||||||
|  | { | ||||||
|  |     _PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op), | ||||||
|  |                           "object already tracked by the garbage collector", | ||||||
|  |                           filename, lineno, __func__); | ||||||
|  | #ifdef Py_GIL_DISABLED | ||||||
|  |     _PyObject_SET_GC_BITS(op, _PyGC_BITS_TRACKED); | ||||||
|  | #else | ||||||
|  |     PyGC_Head *gc = _Py_AS_GC(op); | ||||||
|  |     _PyObject_ASSERT_FROM(op, | ||||||
|  |                           (gc->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0, | ||||||
|  |                           "object is in generation which is garbage collected", | ||||||
|  |                           filename, lineno, __func__); | ||||||
|  | 
 | ||||||
|  |     PyInterpreterState *interp = _PyInterpreterState_GET(); | ||||||
|  |     PyGC_Head *generation0 = &interp->gc.young.head; | ||||||
|  |     PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); | ||||||
|  |     _PyGCHead_SET_NEXT(last, gc); | ||||||
|  |     _PyGCHead_SET_PREV(gc, last); | ||||||
|  |     uintptr_t not_visited = 1 ^ interp->gc.visited_space; | ||||||
|  |     gc->_gc_next = ((uintptr_t)generation0) | not_visited; | ||||||
|  |     generation0->_gc_prev = (uintptr_t)gc; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Tell the GC to stop tracking this object.
 | ||||||
|  |  * | ||||||
|  |  * Internal note: This may be called while GC. So _PyGC_PREV_MASK_COLLECTING | ||||||
|  |  * must be cleared. But _PyGC_PREV_MASK_FINALIZED bit is kept. | ||||||
|  |  * | ||||||
|  |  * The object must be tracked by the GC. | ||||||
|  |  * | ||||||
|  |  * See also the public PyObject_GC_UnTrack() which accept an object which is | ||||||
|  |  * not tracked. | ||||||
|  |  */ | ||||||
|  | static inline void _PyObject_GC_UNTRACK( | ||||||
|  | // The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined
 | ||||||
|  | #ifndef NDEBUG | ||||||
|  |     const char *filename, int lineno, | ||||||
|  | #endif | ||||||
|  |     PyObject *op) | ||||||
|  | { | ||||||
|  |     _PyObject_ASSERT_FROM(op, _PyObject_GC_IS_TRACKED(op), | ||||||
|  |                           "object not tracked by the garbage collector", | ||||||
|  |                           filename, lineno, __func__); | ||||||
|  | 
 | ||||||
|  | #ifdef Py_GIL_DISABLED | ||||||
|  |     _PyObject_CLEAR_GC_BITS(op, _PyGC_BITS_TRACKED); | ||||||
|  | #else | ||||||
|  |     PyGC_Head *gc = _Py_AS_GC(op); | ||||||
|  |     PyGC_Head *prev = _PyGCHead_PREV(gc); | ||||||
|  |     PyGC_Head *next = _PyGCHead_NEXT(gc); | ||||||
|  |     _PyGCHead_SET_NEXT(prev, next); | ||||||
|  |     _PyGCHead_SET_PREV(next, prev); | ||||||
|  |     gc->_gc_next = 0; | ||||||
|  |     gc->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|    NOTE: about untracking of mutable objects. |    NOTE: about untracking of mutable objects. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -100,9 +100,6 @@ extern void _PyInterpreterState_SetWhence( | ||||||
|     PyInterpreterState *interp, |     PyInterpreterState *interp, | ||||||
|     long whence); |     long whence); | ||||||
| 
 | 
 | ||||||
| extern const PyConfig* _PyInterpreterState_GetConfig(PyInterpreterState *interp); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
| Runtime Feature Flags | Runtime Feature Flags | ||||||
| 
 | 
 | ||||||
|  | @ -137,23 +134,6 @@ PyAPI_FUNC(PyStatus) _PyInterpreterState_New( | ||||||
|     PyThreadState *tstate, |     PyThreadState *tstate, | ||||||
|     PyInterpreterState **pinterp); |     PyInterpreterState **pinterp); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #define RARE_EVENT_INTERP_INC(interp, name) \ |  | ||||||
|     do { \ |  | ||||||
|         /* saturating add */ \ |  | ||||||
|         int val = FT_ATOMIC_LOAD_UINT8_RELAXED(interp->rare_events.name); \ |  | ||||||
|         if (val < UINT8_MAX) { \ |  | ||||||
|             FT_ATOMIC_STORE_UINT8(interp->rare_events.name, val + 1); \ |  | ||||||
|         } \ |  | ||||||
|         RARE_EVENT_STAT_INC(name); \ |  | ||||||
|     } while (0); \ |  | ||||||
| 
 |  | ||||||
| #define RARE_EVENT_INC(name) \ |  | ||||||
|     do { \ |  | ||||||
|         PyInterpreterState *interp = PyInterpreterState_Get(); \ |  | ||||||
|         RARE_EVENT_INTERP_INC(interp, name); \ |  | ||||||
|     } while (0); \ |  | ||||||
| 
 |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -9,12 +9,11 @@ extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include "pycore_gc.h"            // _PyObject_GC_IS_TRACKED() |  | ||||||
| #include "pycore_emscripten_trampoline.h" // _PyCFunction_TrampolineCall() | #include "pycore_emscripten_trampoline.h" // _PyCFunction_TrampolineCall() | ||||||
| #include "pycore_interp.h"        // PyInterpreterState.gc | #include "pycore_object_deferred.h" // _PyObject_HasDeferredRefcount | ||||||
| #include "pycore_pyatomic_ft_wrappers.h"  // FT_ATOMIC_STORE_PTR_RELAXED | #include "pycore_pyatomic_ft_wrappers.h"  // FT_ATOMIC_STORE_PTR_RELAXED | ||||||
| #include "pycore_pystate.h"       // _PyInterpreterState_GET() | #include "pycore_pystate.h"       // _PyInterpreterState_GET() | ||||||
| #include "pycore_stackref.h" | #include "pycore_typeobject.h"    // _PyStaticType_GetState() | ||||||
| #include "pycore_uniqueid.h"      // _PyObject_ThreadIncrefSlow() | #include "pycore_uniqueid.h"      // _PyObject_ThreadIncrefSlow() | ||||||
| 
 | 
 | ||||||
| // This value is added to `ob_ref_shared` for objects that use deferred
 | // This value is added to `ob_ref_shared` for objects that use deferred
 | ||||||
|  | @ -455,84 +454,6 @@ _PyObject_InitVar(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) | ||||||
|     Py_SET_SIZE(op, size); |     Py_SET_SIZE(op, size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /* Tell the GC to track this object.
 |  | ||||||
|  * |  | ||||||
|  * The object must not be tracked by the GC. |  | ||||||
|  * |  | ||||||
|  * NB: While the object is tracked by the collector, it must be safe to call the |  | ||||||
|  * ob_traverse method. |  | ||||||
|  * |  | ||||||
|  * Internal note: interp->gc.generation0->_gc_prev doesn't have any bit flags |  | ||||||
|  * because it's not object header.  So we don't use _PyGCHead_PREV() and |  | ||||||
|  * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. |  | ||||||
|  * |  | ||||||
|  * See also the public PyObject_GC_Track() function. |  | ||||||
|  */ |  | ||||||
| static inline void _PyObject_GC_TRACK( |  | ||||||
| // The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined
 |  | ||||||
| #ifndef NDEBUG |  | ||||||
|     const char *filename, int lineno, |  | ||||||
| #endif |  | ||||||
|     PyObject *op) |  | ||||||
| { |  | ||||||
|     _PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op), |  | ||||||
|                           "object already tracked by the garbage collector", |  | ||||||
|                           filename, lineno, __func__); |  | ||||||
| #ifdef Py_GIL_DISABLED |  | ||||||
|     _PyObject_SET_GC_BITS(op, _PyGC_BITS_TRACKED); |  | ||||||
| #else |  | ||||||
|     PyGC_Head *gc = _Py_AS_GC(op); |  | ||||||
|     _PyObject_ASSERT_FROM(op, |  | ||||||
|                           (gc->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0, |  | ||||||
|                           "object is in generation which is garbage collected", |  | ||||||
|                           filename, lineno, __func__); |  | ||||||
| 
 |  | ||||||
|     PyInterpreterState *interp = _PyInterpreterState_GET(); |  | ||||||
|     PyGC_Head *generation0 = &interp->gc.young.head; |  | ||||||
|     PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); |  | ||||||
|     _PyGCHead_SET_NEXT(last, gc); |  | ||||||
|     _PyGCHead_SET_PREV(gc, last); |  | ||||||
|     uintptr_t not_visited = 1 ^ interp->gc.visited_space; |  | ||||||
|     gc->_gc_next = ((uintptr_t)generation0) | not_visited; |  | ||||||
|     generation0->_gc_prev = (uintptr_t)gc; |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tell the GC to stop tracking this object.
 |  | ||||||
|  * |  | ||||||
|  * Internal note: This may be called while GC. So _PyGC_PREV_MASK_COLLECTING |  | ||||||
|  * must be cleared. But _PyGC_PREV_MASK_FINALIZED bit is kept. |  | ||||||
|  * |  | ||||||
|  * The object must be tracked by the GC. |  | ||||||
|  * |  | ||||||
|  * See also the public PyObject_GC_UnTrack() which accept an object which is |  | ||||||
|  * not tracked. |  | ||||||
|  */ |  | ||||||
| static inline void _PyObject_GC_UNTRACK( |  | ||||||
| // The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined
 |  | ||||||
| #ifndef NDEBUG |  | ||||||
|     const char *filename, int lineno, |  | ||||||
| #endif |  | ||||||
|     PyObject *op) |  | ||||||
| { |  | ||||||
|     _PyObject_ASSERT_FROM(op, _PyObject_GC_IS_TRACKED(op), |  | ||||||
|                           "object not tracked by the garbage collector", |  | ||||||
|                           filename, lineno, __func__); |  | ||||||
| 
 |  | ||||||
| #ifdef Py_GIL_DISABLED |  | ||||||
|     _PyObject_CLEAR_GC_BITS(op, _PyGC_BITS_TRACKED); |  | ||||||
| #else |  | ||||||
|     PyGC_Head *gc = _Py_AS_GC(op); |  | ||||||
|     PyGC_Head *prev = _PyGCHead_PREV(gc); |  | ||||||
|     PyGC_Head *next = _PyGCHead_NEXT(gc); |  | ||||||
|     _PyGCHead_SET_NEXT(prev, next); |  | ||||||
|     _PyGCHead_SET_PREV(next, prev); |  | ||||||
|     gc->_gc_next = 0; |  | ||||||
|     gc->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Macros to accept any type for the parameter, and to automatically pass
 | // Macros to accept any type for the parameter, and to automatically pass
 | ||||||
| // the filename and the filename (if NDEBUG is not defined) where the macro
 | // the filename and the filename (if NDEBUG is not defined) where the macro
 | ||||||
| // is called.
 | // is called.
 | ||||||
|  | @ -618,20 +539,6 @@ _Py_TryIncrefCompare(PyObject **src, PyObject *op) | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline int |  | ||||||
| _Py_TryIncrefCompareStackRef(PyObject **src, PyObject *op, _PyStackRef *out) |  | ||||||
| { |  | ||||||
|     if (_PyObject_HasDeferredRefcount(op)) { |  | ||||||
|         *out = (_PyStackRef){ .bits = (intptr_t)op | Py_TAG_DEFERRED }; |  | ||||||
|         return 1; |  | ||||||
|     } |  | ||||||
|     if (_Py_TryIncrefCompare(src, op)) { |  | ||||||
|         *out = PyStackRef_FromPyObjectSteal(op); |  | ||||||
|         return 1; |  | ||||||
|     } |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Loads and increfs an object from ptr, which may contain a NULL value.
 | /* Loads and increfs an object from ptr, which may contain a NULL value.
 | ||||||
|    Safe with concurrent (atomic) updates to ptr. |    Safe with concurrent (atomic) updates to ptr. | ||||||
|    NOTE: The writer must set maybe-weakref on the stored object! */ |    NOTE: The writer must set maybe-weakref on the stored object! */ | ||||||
|  |  | ||||||
|  | @ -11,7 +11,8 @@ extern "C" { | ||||||
| #include "pycore_runtime_structs.h" // _PyRuntime | #include "pycore_runtime_structs.h" // _PyRuntime | ||||||
| #include "pycore_runtime.h"         // _PyRuntimeState_GetFinalizing | #include "pycore_runtime.h"         // _PyRuntimeState_GetFinalizing | ||||||
| #include "pycore_tstate.h"          // _PyThreadStateImpl | #include "pycore_tstate.h"          // _PyThreadStateImpl | ||||||
| #include "pycore_interp.h"          // _PyInterpreterState_GetConfig | 
 | ||||||
|  | extern const PyConfig* _PyInterpreterState_GetConfig(PyInterpreterState *interp); | ||||||
| 
 | 
 | ||||||
| // Values for PyThreadState.state. A thread must be in the "attached" state
 | // Values for PyThreadState.state. A thread must be in the "attached" state
 | ||||||
| // before calling most Python APIs. If the GIL is enabled, then "attached"
 | // before calling most Python APIs. If the GIL is enabled, then "attached"
 | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include "pycore_object_deferred.h" | #include "pycore_object_deferred.h" | ||||||
|  | #include "pycore_object.h" | ||||||
| 
 | 
 | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
|  | @ -639,6 +640,24 @@ PyStackRef_FunctionCheck(_PyStackRef stackref) | ||||||
|     return PyFunction_Check(PyStackRef_AsPyObjectBorrow(stackref)); |     return PyFunction_Check(PyStackRef_AsPyObjectBorrow(stackref)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef Py_GIL_DISABLED | ||||||
|  | 
 | ||||||
|  | static inline int | ||||||
|  | _Py_TryIncrefCompareStackRef(PyObject **src, PyObject *op, _PyStackRef *out) | ||||||
|  | { | ||||||
|  |     if (_PyObject_HasDeferredRefcount(op)) { | ||||||
|  |         *out = (_PyStackRef){ .bits = (intptr_t)op | Py_TAG_DEFERRED }; | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |     if (_Py_TryIncrefCompare(src, op)) { | ||||||
|  |         *out = PyStackRef_FromPyObjectSteal(op); | ||||||
|  |         return 1; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
							
								
								
									
										97
									
								
								Include/internal/pycore_stats.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								Include/internal/pycore_stats.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | ||||||
|  | #ifndef Py_INTERNAL_STATS_H | ||||||
|  | #define Py_INTERNAL_STATS_H | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifndef Py_BUILD_CORE | ||||||
|  | #  error "this header requires Py_BUILD_CORE define" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #include "pycore_structs.h"     // | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef Py_STATS | ||||||
|  | 
 | ||||||
|  | #include "pycore_bitutils.h"  // _Py_bit_length | ||||||
|  | 
 | ||||||
|  | #define STAT_INC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name++; } while (0) | ||||||
|  | #define STAT_DEC(opname, name) do { if (_Py_stats) _Py_stats->opcode_stats[opname].specialization.name--; } while (0) | ||||||
|  | #define OPCODE_EXE_INC(opname) do { if (_Py_stats) _Py_stats->opcode_stats[opname].execution_count++; } while (0) | ||||||
|  | #define CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.name++; } while (0) | ||||||
|  | #define OBJECT_STAT_INC(name) do { if (_Py_stats) _Py_stats->object_stats.name++; } while (0) | ||||||
|  | #define OBJECT_STAT_INC_COND(name, cond) \ | ||||||
|  |     do { if (_Py_stats && cond) _Py_stats->object_stats.name++; } while (0) | ||||||
|  | #define EVAL_CALL_STAT_INC(name) do { if (_Py_stats) _Py_stats->call_stats.eval_calls[name]++; } while (0) | ||||||
|  | #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) \ | ||||||
|  |     do { if (_Py_stats && PyFunction_Check(callable)) _Py_stats->call_stats.eval_calls[name]++; } while (0) | ||||||
|  | #define GC_STAT_ADD(gen, name, n) do { if (_Py_stats) _Py_stats->gc_stats[(gen)].name += (n); } while (0) | ||||||
|  | #define OPT_STAT_INC(name) do { if (_Py_stats) _Py_stats->optimization_stats.name++; } while (0) | ||||||
|  | #define OPT_STAT_ADD(name, n) do { if (_Py_stats) _Py_stats->optimization_stats.name += (n); } while (0) | ||||||
|  | #define UOP_STAT_INC(opname, name) do { if (_Py_stats) { assert(opname < 512); _Py_stats->optimization_stats.opcode[opname].name++; } } while (0) | ||||||
|  | #define UOP_PAIR_INC(uopcode, lastuop)                                              \ | ||||||
|  |     do {                                                                            \ | ||||||
|  |         if (lastuop && _Py_stats) {                                                 \ | ||||||
|  |             _Py_stats->optimization_stats.opcode[lastuop].pair_count[uopcode]++;    \ | ||||||
|  |         }                                                                           \ | ||||||
|  |         lastuop = uopcode;                                                          \ | ||||||
|  |     } while (0) | ||||||
|  | #define OPT_UNSUPPORTED_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.unsupported_opcode[opname]++; } while (0) | ||||||
|  | #define OPT_ERROR_IN_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.error_in_opcode[opname]++; } while (0) | ||||||
|  | #define OPT_HIST(length, name) \ | ||||||
|  |     do { \ | ||||||
|  |         if (_Py_stats) { \ | ||||||
|  |             int bucket = _Py_bit_length(length >= 1 ? length - 1 : 0); \ | ||||||
|  |             bucket = (bucket >= _Py_UOP_HIST_SIZE) ? _Py_UOP_HIST_SIZE - 1 : bucket; \ | ||||||
|  |             _Py_stats->optimization_stats.name[bucket]++; \ | ||||||
|  |         } \ | ||||||
|  |     } while (0) | ||||||
|  | #define RARE_EVENT_STAT_INC(name) do { if (_Py_stats) _Py_stats->rare_event_stats.name++; } while (0) | ||||||
|  | #define OPCODE_DEFERRED_INC(opname) do { if (_Py_stats && opcode == opname) _Py_stats->opcode_stats[opname].specialization.deferred++; } while (0) | ||||||
|  | 
 | ||||||
|  | // Export for '_opcode' shared extension
 | ||||||
|  | PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | #define STAT_INC(opname, name) ((void)0) | ||||||
|  | #define STAT_DEC(opname, name) ((void)0) | ||||||
|  | #define OPCODE_EXE_INC(opname) ((void)0) | ||||||
|  | #define CALL_STAT_INC(name) ((void)0) | ||||||
|  | #define OBJECT_STAT_INC(name) ((void)0) | ||||||
|  | #define OBJECT_STAT_INC_COND(name, cond) ((void)0) | ||||||
|  | #define EVAL_CALL_STAT_INC(name) ((void)0) | ||||||
|  | #define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) ((void)0) | ||||||
|  | #define GC_STAT_ADD(gen, name, n) ((void)0) | ||||||
|  | #define OPT_STAT_INC(name) ((void)0) | ||||||
|  | #define OPT_STAT_ADD(name, n) ((void)0) | ||||||
|  | #define UOP_STAT_INC(opname, name) ((void)0) | ||||||
|  | #define UOP_PAIR_INC(uopcode, lastuop) ((void)0) | ||||||
|  | #define OPT_UNSUPPORTED_OPCODE(opname) ((void)0) | ||||||
|  | #define OPT_ERROR_IN_OPCODE(opname) ((void)0) | ||||||
|  | #define OPT_HIST(length, name) ((void)0) | ||||||
|  | #define RARE_EVENT_STAT_INC(name) ((void)0) | ||||||
|  | #define OPCODE_DEFERRED_INC(opname) ((void)0) | ||||||
|  | #endif  // !Py_STATS
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #define RARE_EVENT_INTERP_INC(interp, name) \ | ||||||
|  |     do { \ | ||||||
|  |         /* saturating add */ \ | ||||||
|  |         int val = FT_ATOMIC_LOAD_UINT8_RELAXED(interp->rare_events.name); \ | ||||||
|  |         if (val < UINT8_MAX) { \ | ||||||
|  |             FT_ATOMIC_STORE_UINT8(interp->rare_events.name, val + 1); \ | ||||||
|  |         } \ | ||||||
|  |         RARE_EVENT_STAT_INC(name); \ | ||||||
|  |     } while (0); \ | ||||||
|  | 
 | ||||||
|  | #define RARE_EVENT_INC(name) \ | ||||||
|  |     do { \ | ||||||
|  |         PyInterpreterState *interp = PyInterpreterState_Get(); \ | ||||||
|  |         RARE_EVENT_INTERP_INC(interp, name); \ | ||||||
|  |     } while (0); \ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif /* !Py_INTERNAL_STATS_H */ | ||||||
|  | @ -8,9 +8,10 @@ extern "C" { | ||||||
| #  error "this header requires Py_BUILD_CORE define" | #  error "this header requires Py_BUILD_CORE define" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #include "pycore_function.h" | ||||||
| #include "pycore_moduleobject.h"  // PyModuleObject | #include "pycore_moduleobject.h"  // PyModuleObject | ||||||
| #include "pycore_lock.h"          // PyMutex |  | ||||||
| #include "pycore_runtime_structs.h" // type state | #include "pycore_runtime_structs.h" // type state | ||||||
|  | #include "pycore_stats.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* state */ | /* state */ | ||||||
|  |  | ||||||
|  | @ -1303,6 +1303,7 @@ PYTHON_HEADERS= \ | ||||||
| 		$(srcdir)/Include/internal/pycore_setobject.h \ | 		$(srcdir)/Include/internal/pycore_setobject.h \ | ||||||
| 		$(srcdir)/Include/internal/pycore_signal.h \ | 		$(srcdir)/Include/internal/pycore_signal.h \ | ||||||
| 		$(srcdir)/Include/internal/pycore_sliceobject.h \ | 		$(srcdir)/Include/internal/pycore_sliceobject.h \ | ||||||
|  | 		$(srcdir)/Include/internal/pycore_stats.h \ | ||||||
| 		$(srcdir)/Include/internal/pycore_strhex.h \ | 		$(srcdir)/Include/internal/pycore_strhex.h \ | ||||||
| 		$(srcdir)/Include/internal/pycore_structs.h \ | 		$(srcdir)/Include/internal/pycore_structs.h \ | ||||||
| 		$(srcdir)/Include/internal/pycore_structseq.h \ | 		$(srcdir)/Include/internal/pycore_structseq.h \ | ||||||
|  |  | ||||||
|  | @ -6,7 +6,9 @@ | ||||||
| #include "pycore_critical_section.h"  // Py_BEGIN_CRITICAL_SECTION_MUT() | #include "pycore_critical_section.h"  // Py_BEGIN_CRITICAL_SECTION_MUT() | ||||||
| #include "pycore_dict.h"          // _PyDict_GetItem_KnownHash() | #include "pycore_dict.h"          // _PyDict_GetItem_KnownHash() | ||||||
| #include "pycore_freelist.h"      // _Py_FREELIST_POP() | #include "pycore_freelist.h"      // _Py_FREELIST_POP() | ||||||
|  | #include "pycore_genobject.h" | ||||||
| #include "pycore_llist.h"         // struct llist_node | #include "pycore_llist.h"         // struct llist_node | ||||||
|  | #include "pycore_list.h"          // _PyList_AppendTakeRef() | ||||||
| #include "pycore_modsupport.h"    // _PyArg_CheckPositional() | #include "pycore_modsupport.h"    // _PyArg_CheckPositional() | ||||||
| #include "pycore_moduleobject.h"  // _PyModule_GetState() | #include "pycore_moduleobject.h"  // _PyModule_GetState() | ||||||
| #include "pycore_object.h"        // _PyObject_SetMaybeWeakref | #include "pycore_object.h"        // _PyObject_SetMaybeWeakref | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| #include "pycore_long.h"          // _PyLong_GetOne() | #include "pycore_long.h"          // _PyLong_GetOne() | ||||||
| #include "pycore_object.h"        // _PyObject_Init() | #include "pycore_object.h"        // _PyObject_Init() | ||||||
| #include "pycore_time.h"          // _PyTime_ObjectToTime_t() | #include "pycore_time.h"          // _PyTime_ObjectToTime_t() | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_Copy() | ||||||
| 
 | 
 | ||||||
| #include "datetime.h" | #include "datetime.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_call.h"                // _PyObject_CallNoArgs() | #include "pycore_call.h"                // _PyObject_CallNoArgs() | ||||||
|  | #include "pycore_fileutils.h"           // _PyFile_Flush | ||||||
| #include "pycore_object.h"              // _PyObject_GC_UNTRACK() | #include "pycore_object.h"              // _PyObject_GC_UNTRACK() | ||||||
| #include "pycore_pyerrors.h"            // _Py_FatalErrorFormat() | #include "pycore_pyerrors.h"            // _Py_FatalErrorFormat() | ||||||
| #include "pycore_pylifecycle.h"         // _Py_IsInterpreterFinalizing() | #include "pycore_pylifecycle.h"         // _Py_IsInterpreterFinalizing() | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_call.h"          // _PyObject_CallMethod() | #include "pycore_call.h"          // _PyObject_CallMethod() | ||||||
|  | #include "pycore_fileutils.h"           // _PyFile_Flush | ||||||
| #include "pycore_long.h"          // _PyLong_GetOne() | #include "pycore_long.h"          // _PyLong_GetOne() | ||||||
| #include "pycore_object.h"        // _PyType_HasFeature() | #include "pycore_object.h"        // _PyType_HasFeature() | ||||||
| #include "pycore_pyerrors.h"      // _PyErr_ChainExceptions1() | #include "pycore_pyerrors.h"      // _PyErr_ChainExceptions1() | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ | ||||||
| #include "pycore_modsupport.h"    // _PyArg_NoKeywords() | #include "pycore_modsupport.h"    // _PyArg_NoKeywords() | ||||||
| #include "pycore_pyerrors.h"      // _PyErr_ChainExceptions1() | #include "pycore_pyerrors.h"      // _PyErr_ChainExceptions1() | ||||||
| #include "pycore_pylifecycle.h"   // _Py_IsInterpreterFinalizing() | #include "pycore_pylifecycle.h"   // _Py_IsInterpreterFinalizing() | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_AsUTF8NoNUL | ||||||
| #include "pycore_weakref.h" | #include "pycore_weakref.h" | ||||||
| 
 | 
 | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
|  |  | ||||||
|  | @ -43,6 +43,7 @@ static const char copyright[] = | ||||||
| #include "pycore_dict.h"             // _PyDict_Next() | #include "pycore_dict.h"             // _PyDict_Next() | ||||||
| #include "pycore_long.h"             // _PyLong_GetZero() | #include "pycore_long.h"             // _PyLong_GetZero() | ||||||
| #include "pycore_moduleobject.h"     // _PyModule_GetState() | #include "pycore_moduleobject.h"     // _PyModule_GetState() | ||||||
|  | #include "pycore_unicodeobject.h"    // _PyUnicode_Copy | ||||||
| 
 | 
 | ||||||
| #include "sre.h"                     // SRE_CODE | #include "sre.h"                     // SRE_CODE | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| /* Interface to Sjoerd's portable C thread library */ | /* Interface to Sjoerd's portable C thread library */ | ||||||
| 
 | 
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
|  | #include "pycore_fileutils.h"     // _PyFile_Flush | ||||||
| #include "pycore_interp.h"        // _PyInterpreterState.threads.count | #include "pycore_interp.h"        // _PyInterpreterState.threads.count | ||||||
| #include "pycore_lock.h" | #include "pycore_lock.h" | ||||||
| #include "pycore_moduleobject.h"  // _PyModule_GetState() | #include "pycore_moduleobject.h"  // _PyModule_GetState() | ||||||
|  |  | ||||||
|  | @ -38,6 +38,7 @@ | ||||||
| #include "pycore_moduleobject.h"  // _PyModule_GetState() | #include "pycore_moduleobject.h"  // _PyModule_GetState() | ||||||
| #include "pycore_pylifecycle.h"   // _Py_IsInterpreterFinalizing() | #include "pycore_pylifecycle.h"   // _Py_IsInterpreterFinalizing() | ||||||
| #include "pycore_pystate.h"       // _PyInterpreterState_GET | #include "pycore_pystate.h"       // _PyInterpreterState_GET | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_WideCharString_Opt_Converter | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include "pycore_ceval.h"         // _PyEval_IsGILEnabled() | #include "pycore_ceval.h"         // _PyEval_IsGILEnabled() | ||||||
| #include "pycore_initconfig.h"    // _PyStatus_ERR() | #include "pycore_initconfig.h"    // _PyStatus_ERR() | ||||||
| #include "pycore_pyerrors.h"      // _Py_DumpExtensionModules() | #include "pycore_pyerrors.h"      // _Py_DumpExtensionModules() | ||||||
|  | #include "pycore_fileutils.h"     // _PyFile_Flush | ||||||
| #include "pycore_pystate.h"       // _PyThreadState_GET() | #include "pycore_pystate.h"       // _PyThreadState_GET() | ||||||
| #include "pycore_runtime.h"       // _Py_ID() | #include "pycore_runtime.h"       // _Py_ID() | ||||||
| #include "pycore_signal.h"        // Py_NSIG | #include "pycore_signal.h"        // Py_NSIG | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #include "pycore_long.h"          // _PyLong_GetOne() | #include "pycore_long.h"          // _PyLong_GetOne() | ||||||
| #include "pycore_modsupport.h"    // _PyArg_NoKwnames() | #include "pycore_modsupport.h"    // _PyArg_NoKwnames() | ||||||
| #include "pycore_object.h"        // _PyObject_GC_TRACK() | #include "pycore_object.h"        // _PyObject_GC_TRACK() | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString | ||||||
| 
 | 
 | ||||||
| #include "clinic/enumobject.c.h" | #include "clinic/enumobject.c.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ | ||||||
| #include "pycore_object.h"        // _PyObject_Init(), _PyDebugAllocatorStats() | #include "pycore_object.h"        // _PyObject_Init(), _PyDebugAllocatorStats() | ||||||
| #include "pycore_pymath.h"        // _PY_SHORT_FLOAT_REPR | #include "pycore_pymath.h"        // _PY_SHORT_FLOAT_REPR | ||||||
| #include "pycore_pystate.h"       // _PyInterpreterState_GET() | #include "pycore_pystate.h"       // _PyInterpreterState_GET() | ||||||
|  | #include "pycore_stackref.h"      // PyStackRef_AsPyObjectBorrow() | ||||||
| #include "pycore_structseq.h"     // _PyStructSequence_FiniBuiltin() | #include "pycore_structseq.h"     // _PyStructSequence_FiniBuiltin() | ||||||
| 
 | 
 | ||||||
| #include <float.h>                // DBL_MAX | #include <float.h>                // DBL_MAX | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #include "pycore_code.h"          // CO_FAST_LOCAL, etc. | #include "pycore_code.h"          // CO_FAST_LOCAL, etc. | ||||||
| #include "pycore_dict.h"          // _PyDict_LoadBuiltinsFromGlobals() | #include "pycore_dict.h"          // _PyDict_LoadBuiltinsFromGlobals() | ||||||
| #include "pycore_function.h"      // _PyFunction_FromConstructor() | #include "pycore_function.h"      // _PyFunction_FromConstructor() | ||||||
|  | #include "pycore_genobject.h"     // _PyGen_GetGeneratorFromFrame() | ||||||
| #include "pycore_moduleobject.h"  // _PyModule_GetDict() | #include "pycore_moduleobject.h"  // _PyModule_GetDict() | ||||||
| #include "pycore_modsupport.h"    // _PyArg_CheckPositional() | #include "pycore_modsupport.h"    // _PyArg_CheckPositional() | ||||||
| #include "pycore_object.h"        // _PyObject_GC_UNTRACK() | #include "pycore_object.h"        // _PyObject_GC_UNTRACK() | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ | ||||||
| #include "pycore_modsupport.h"          // _PyArg_NoKeywords() | #include "pycore_modsupport.h"          // _PyArg_NoKeywords() | ||||||
| #include "pycore_object.h"              // _PyObject_GC_UNTRACK() | #include "pycore_object.h"              // _PyObject_GC_UNTRACK() | ||||||
| #include "pycore_pyerrors.h"            // _PyErr_Occurred() | #include "pycore_pyerrors.h"            // _PyErr_Occurred() | ||||||
|  | #include "pycore_stats.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static const char * | static const char * | ||||||
|  |  | ||||||
|  | @ -17,8 +17,6 @@ | ||||||
| #include "pycore_pyerrors.h"      // _PyErr_ClearExcState() | #include "pycore_pyerrors.h"      // _PyErr_ClearExcState() | ||||||
| #include "pycore_pystate.h"       // _PyThreadState_GET() | #include "pycore_pystate.h"       // _PyThreadState_GET() | ||||||
| 
 | 
 | ||||||
| #include "pystats.h" |  | ||||||
| 
 |  | ||||||
| // Forward declarations
 | // Forward declarations
 | ||||||
| static PyObject* gen_close(PyObject *, PyObject *); | static PyObject* gen_close(PyObject *, PyObject *); | ||||||
| static PyObject* async_gen_asend_new(PyAsyncGenObject *, PyObject *); | static PyObject* async_gen_asend_new(PyAsyncGenObject *, PyObject *); | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ | ||||||
| #include "pycore_long.h"          // _PyLong_DigitCount | #include "pycore_long.h"          // _PyLong_DigitCount | ||||||
| #include "pycore_modsupport.h"    // _PyArg_NoKwnames() | #include "pycore_modsupport.h"    // _PyArg_NoKwnames() | ||||||
| #include "pycore_object.h"        // _PyObject_GC_TRACK(), _PyDebugAllocatorStats() | #include "pycore_object.h"        // _PyObject_GC_TRACK(), _PyDebugAllocatorStats() | ||||||
|  | #include "pycore_stackref.h"      // _Py_TryIncrefCompareStackRef() | ||||||
| #include "pycore_tuple.h"         // _PyTuple_FromArray() | #include "pycore_tuple.h"         // _PyTuple_FromArray() | ||||||
| #include "pycore_typeobject.h"    // _Py_TYPE_VERSION_LIST | #include "pycore_typeobject.h"    // _Py_TYPE_VERSION_LIST | ||||||
| #include "pycore_setobject.h"     // _PySet_NextEntry() | #include "pycore_setobject.h"     // _PySet_NextEntry() | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
| #include "pycore_object.h"        // _PyObject_Init() | #include "pycore_object.h"        // _PyObject_Init() | ||||||
| #include "pycore_runtime.h"       // _PY_NSMALLPOSINTS | #include "pycore_runtime.h"       // _PY_NSMALLPOSINTS | ||||||
| #include "pycore_structseq.h"     // _PyStructSequence_FiniBuiltin() | #include "pycore_structseq.h"     // _PyStructSequence_FiniBuiltin() | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_Equal() | ||||||
| 
 | 
 | ||||||
| #include <float.h>                // DBL_MANT_DIG | #include <float.h>                // DBL_MANT_DIG | ||||||
| #include <stddef.h>               // offsetof | #include <stddef.h>               // offsetof | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_code.h"          // stats | #include "pycore_code.h"          // stats | ||||||
|  | #include "pycore_interp.h"        // _PyInterpreterState_HasFeature | ||||||
| #include "pycore_object.h"        // _PyDebugAllocatorStats() definition | #include "pycore_object.h"        // _PyDebugAllocatorStats() definition | ||||||
| #include "pycore_obmalloc.h" | #include "pycore_obmalloc.h" | ||||||
| #include "pycore_pyerrors.h"      // _Py_FatalErrorFormat() | #include "pycore_pyerrors.h"      // _Py_FatalErrorFormat() | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
| #include "pycore_object.h"        // _PyObject_GC_TRACK() | #include "pycore_object.h"        // _PyObject_GC_TRACK() | ||||||
| #include "pycore_structseq.h"     // PyStructSequence_InitType() | #include "pycore_structseq.h"     // PyStructSequence_InitType() | ||||||
| #include "pycore_tuple.h"         // _PyTuple_FromArray() | #include "pycore_tuple.h"         // _PyTuple_FromArray() | ||||||
|  | #include "pycore_typeobject.h"    // _PyStaticType_FiniBuiltin() | ||||||
| 
 | 
 | ||||||
| static const char visible_length_key[] = "n_sequence_fields"; | static const char visible_length_key[] = "n_sequence_fields"; | ||||||
| static const char real_length_key[] = "n_fields"; | static const char real_length_key[] = "n_fields"; | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| #include "pycore_code.h"          // CO_FAST_FREE | #include "pycore_code.h"          // CO_FAST_FREE | ||||||
| #include "pycore_dict.h"          // _PyDict_KeysSize() | #include "pycore_dict.h"          // _PyDict_KeysSize() | ||||||
| #include "pycore_frame.h"         // _PyInterpreterFrame | #include "pycore_frame.h"         // _PyInterpreterFrame | ||||||
|  | #include "pycore_function.h"      // _PyFunction_GetVersionForCurrentState() | ||||||
| #include "pycore_lock.h"          // _PySeqLock_* | #include "pycore_lock.h"          // _PySeqLock_* | ||||||
| #include "pycore_long.h"          // _PyLong_IsNegative(), _PyLong_GetOne() | #include "pycore_long.h"          // _PyLong_IsNegative(), _PyLong_GetOne() | ||||||
| #include "pycore_memoryobject.h"  // _PyMemoryView_FromBufferProc() | #include "pycore_memoryobject.h"  // _PyMemoryView_FromBufferProc() | ||||||
|  | @ -18,9 +19,11 @@ | ||||||
| #include "pycore_pystate.h"       // _PyThreadState_GET() | #include "pycore_pystate.h"       // _PyThreadState_GET() | ||||||
| #include "pycore_symtable.h"      // _Py_Mangle() | #include "pycore_symtable.h"      // _Py_Mangle() | ||||||
| #include "pycore_typeobject.h"    // struct type_cache | #include "pycore_typeobject.h"    // struct type_cache | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_Copy | ||||||
| #include "pycore_unionobject.h"   // _Py_union_type_or | #include "pycore_unionobject.h"   // _Py_union_type_or | ||||||
| #include "pycore_weakref.h"       // _PyWeakref_GET_REF() | #include "pycore_weakref.h"       // _PyWeakref_GET_REF() | ||||||
| #include "pycore_cell.h"          // PyCell_GetRef() | #include "pycore_cell.h"          // PyCell_GetRef() | ||||||
|  | #include "pycore_stats.h" | ||||||
| #include "opcode.h"               // MAKE_CELL | #include "opcode.h"               // MAKE_CELL | ||||||
| 
 | 
 | ||||||
| #include <stddef.h>               // ptrdiff_t | #include <stddef.h>               // ptrdiff_t | ||||||
|  |  | ||||||
|  | @ -1,8 +1,10 @@ | ||||||
| // TypeVar, TypeVarTuple, ParamSpec, and TypeAlias
 | // TypeVar, TypeVarTuple, ParamSpec, and TypeAlias
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
|  | #include "pycore_frame.h"         // _PyInterpreterFrame | ||||||
| #include "pycore_object.h"        // _PyObject_GC_TRACK/UNTRACK, PyAnnotateFormat | #include "pycore_object.h"        // _PyObject_GC_TRACK/UNTRACK, PyAnnotateFormat | ||||||
| #include "pycore_typevarobject.h" | #include "pycore_typevarobject.h" | ||||||
| #include "pycore_unionobject.h"   // _Py_union_type_or, _Py_union_from_tuple | #include "pycore_unionobject.h"   // _Py_union_type_or, _Py_union_from_tuple | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | ||||||
| #include "structmember.h" | #include "structmember.h" | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_object.h"  // _PyObject_GC_TRACK/UNTRACK | #include "pycore_object.h"  // _PyObject_GC_TRACK/UNTRACK | ||||||
| #include "pycore_typevarobject.h"  // _PyTypeAlias_Type, _Py_typing_type_repr | #include "pycore_typevarobject.h"  // _PyTypeAlias_Type, _Py_typing_type_repr | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString | ||||||
| #include "pycore_unionobject.h" | #include "pycore_unionobject.h" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -292,15 +292,18 @@ | ||||||
|     <ClInclude Include="..\Include\internal\pycore_runtime.h" /> |     <ClInclude Include="..\Include\internal\pycore_runtime.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_runtime_init.h" /> |     <ClInclude Include="..\Include\internal\pycore_runtime_init.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_runtime_init_generated.h" /> |     <ClInclude Include="..\Include\internal\pycore_runtime_init_generated.h" /> | ||||||
|  |     <ClInclude Include="..\Include\internal\pycore_runtime_structs.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_semaphore.h" /> |     <ClInclude Include="..\Include\internal\pycore_semaphore.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_setobject.h" /> |     <ClInclude Include="..\Include\internal\pycore_setobject.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_signal.h" /> |     <ClInclude Include="..\Include\internal\pycore_signal.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_sliceobject.h" /> |     <ClInclude Include="..\Include\internal\pycore_sliceobject.h" /> | ||||||
|  |     <ClInclude Include="..\Include\internal\pycore_stackref.h" /> | ||||||
|  |     <ClInclude Include="..\Include\internal\pycore_stats.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_strhex.h" /> |     <ClInclude Include="..\Include\internal\pycore_strhex.h" /> | ||||||
|  |     <ClInclude Include="..\Include\internal\pycore_structs.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_structseq.h" /> |     <ClInclude Include="..\Include\internal\pycore_structseq.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_sysmodule.h" /> |     <ClInclude Include="..\Include\internal\pycore_sysmodule.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_symtable.h" /> |     <ClInclude Include="..\Include\internal\pycore_symtable.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_stackref.h" /> |  | ||||||
|     <ClInclude Include="..\Include\internal\pycore_time.h" /> |     <ClInclude Include="..\Include\internal\pycore_time.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_token.h" /> |     <ClInclude Include="..\Include\internal\pycore_token.h" /> | ||||||
|     <ClInclude Include="..\Include\internal\pycore_traceback.h" /> |     <ClInclude Include="..\Include\internal\pycore_traceback.h" /> | ||||||
|  |  | ||||||
|  | @ -219,15 +219,24 @@ | ||||||
|     <ClInclude Include="..\Include\refcount.h"> |     <ClInclude Include="..\Include\refcount.h"> | ||||||
|       <Filter>Include</Filter> |       <Filter>Include</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\Include\runtime_structs.h"> | ||||||
|  |       <Filter>Include</Filter> | ||||||
|  |     </ClInclude> | ||||||
|     <ClInclude Include="..\Include\setobject.h"> |     <ClInclude Include="..\Include\setobject.h"> | ||||||
|       <Filter>Include</Filter> |       <Filter>Include</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|     <ClInclude Include="..\Include\sliceobject.h"> |     <ClInclude Include="..\Include\sliceobject.h"> | ||||||
|       <Filter>Include</Filter> |       <Filter>Include</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\Include\stats.h"> | ||||||
|  |       <Filter>Include</Filter> | ||||||
|  |     </ClInclude> | ||||||
|     <ClInclude Include="..\Include\structmember.h"> |     <ClInclude Include="..\Include\structmember.h"> | ||||||
|       <Filter>Include</Filter> |       <Filter>Include</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="..\Include\structs.h"> | ||||||
|  |       <Filter>Include</Filter> | ||||||
|  |     </ClInclude> | ||||||
|     <ClInclude Include="..\Include\structseq.h"> |     <ClInclude Include="..\Include\structseq.h"> | ||||||
|       <Filter>Include</Filter> |       <Filter>Include</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| #include "string_parser.h"          // _PyPegen_decode_string() | #include "string_parser.h"          // _PyPegen_decode_string() | ||||||
| 
 | 
 | ||||||
| #include "pycore_pystate.h"         // _PyInterpreterState_GET() | #include "pycore_pystate.h"         // _PyInterpreterState_GET() | ||||||
| #include "pycore_runtime.h"         // _PyRuntime | #include "pycore_unicodeobject.h"   // _PyUnicode_InternImmortal() | ||||||
| #include "pycore_unicodeobject.h"   // _PyUnicode_InternImmortal() | #include "pycore_unicodeobject.h"   // _PyUnicode_InternImmortal() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #include "pycore_format.h"        // F_LJUST | #include "pycore_format.h"        // F_LJUST | ||||||
| #include "pycore_runtime.h"       // _Py_STR() | #include "pycore_runtime.h"       // _Py_STR() | ||||||
| #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #include "pycore_call.h"          // _PyObject_CallNoArgs() | #include "pycore_call.h"          // _PyObject_CallNoArgs() | ||||||
| #include "pycore_ceval.h"         // _PyEval_Vector() | #include "pycore_ceval.h"         // _PyEval_Vector() | ||||||
| #include "pycore_compile.h"       // _PyAST_Compile() | #include "pycore_compile.h"       // _PyAST_Compile() | ||||||
|  | #include "pycore_fileutils.h"     // _PyFile_Flush | ||||||
| #include "pycore_long.h"          // _PyLong_CompactValue | #include "pycore_long.h"          // _PyLong_CompactValue | ||||||
| #include "pycore_modsupport.h"    // _PyArg_NoKwnames() | #include "pycore_modsupport.h"    // _PyArg_NoKwnames() | ||||||
| #include "pycore_object.h"        // _Py_AddToAllObjects() | #include "pycore_object.h"        // _Py_AddToAllObjects() | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ | ||||||
| #include "pycore_long.h"          // _PyLong_ExactDealloc() | #include "pycore_long.h"          // _PyLong_ExactDealloc() | ||||||
| #include "pycore_setobject.h"     // _PySet_NextEntry() | #include "pycore_setobject.h"     // _PySet_NextEntry() | ||||||
| #include "pycore_sliceobject.h"   // _PyBuildSlice_ConsumeRefs | #include "pycore_sliceobject.h"   // _PyBuildSlice_ConsumeRefs | ||||||
|  | #include "pycore_stackref.h" | ||||||
| #include "pycore_tuple.h"         // _PyTuple_ITEMS() | #include "pycore_tuple.h"         // _PyTuple_ITEMS() | ||||||
| #include "pycore_typeobject.h"    // _PySuper_Lookup() | #include "pycore_typeobject.h"    // _PySuper_Lookup() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ | ||||||
| #include "pycore_opcode_utils.h" | #include "pycore_opcode_utils.h" | ||||||
| #undef NEED_OPCODE_TABLES | #undef NEED_OPCODE_TABLES | ||||||
| #include "pycore_c_array.h"       // _Py_c_array_t | #include "pycore_c_array.h"       // _Py_c_array_t | ||||||
|  | #include "pycore_code.h"          // COMPARISON_LESS_THAN | ||||||
| #include "pycore_compile.h" | #include "pycore_compile.h" | ||||||
| #include "pycore_instruction_sequence.h" // _PyInstructionSequence_NewLabel() | #include "pycore_instruction_sequence.h" // _PyInstructionSequence_NewLabel() | ||||||
| #include "pycore_intrinsics.h" | #include "pycore_intrinsics.h" | ||||||
|  | @ -26,6 +27,7 @@ | ||||||
| #include "pycore_object.h"        // _Py_ANNOTATE_FORMAT_VALUE_WITH_FAKE_GLOBALS | #include "pycore_object.h"        // _Py_ANNOTATE_FORMAT_VALUE_WITH_FAKE_GLOBALS | ||||||
| #include "pycore_pystate.h"       // _Py_GetConfig() | #include "pycore_pystate.h"       // _Py_GetConfig() | ||||||
| #include "pycore_symtable.h"      // PySTEntryObject | #include "pycore_symtable.h"      // PySTEntryObject | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString | ||||||
| 
 | 
 | ||||||
| #define NEED_OPCODE_METADATA | #define NEED_OPCODE_METADATA | ||||||
| #include "pycore_opcode_metadata.h" // _PyOpcode_opcode_metadata, _PyOpcode_num_popped/pushed | #include "pycore_opcode_metadata.h" // _PyOpcode_opcode_metadata, _PyOpcode_num_popped/pushed | ||||||
|  |  | ||||||
|  | @ -16,12 +16,13 @@ | ||||||
| 
 | 
 | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_ast.h"           // PyAST_Check() | #include "pycore_ast.h"           // PyAST_Check() | ||||||
| #include "pycore_code.h"          // _PyCode_GetFreevars() | #include "pycore_code.h" | ||||||
| #include "pycore_compile.h" | #include "pycore_compile.h" | ||||||
| #include "pycore_flowgraph.h"     // _PyCfg_FromInstructionSequence() | #include "pycore_flowgraph.h"     // _PyCfg_FromInstructionSequence() | ||||||
| #include "pycore_pystate.h"       // _Py_GetConfig() | #include "pycore_pystate.h"       // _Py_GetConfig() | ||||||
| #include "pycore_runtime.h"       // _Py_ID() | #include "pycore_runtime.h"       // _Py_ID() | ||||||
| #include "pycore_setobject.h"     // _PySet_NextEntry() | #include "pycore_setobject.h"     // _PySet_NextEntry() | ||||||
|  | #include "pycore_stats.h" | ||||||
| #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | ||||||
| 
 | 
 | ||||||
| #include "cpython/code.h" | #include "cpython/code.h" | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_audit.h"         // _PySys_Audit() | #include "pycore_audit.h"         // _PySys_Audit() | ||||||
| #include "pycore_call.h"          // _PyObject_CallNoArgs() | #include "pycore_call.h"          // _PyObject_CallNoArgs() | ||||||
|  | #include "pycore_fileutils.h"     // _PyFile_Flush | ||||||
| #include "pycore_initconfig.h"    // _PyStatus_ERR() | #include "pycore_initconfig.h"    // _PyStatus_ERR() | ||||||
| #include "pycore_pyerrors.h"      // _PyErr_Format() | #include "pycore_pyerrors.h"      // _PyErr_Format() | ||||||
| #include "pycore_pystate.h"       // _PyThreadState_GET() | #include "pycore_pystate.h"       // _PyThreadState_GET() | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #include "frameobject.h" | #include "frameobject.h" | ||||||
| #include "pycore_code.h"          // stats | #include "pycore_code.h"          // stats | ||||||
| #include "pycore_frame.h" | #include "pycore_frame.h" | ||||||
|  | #include "pycore_genobject.h" | ||||||
| #include "pycore_object.h"        // _PyObject_GC_UNTRACK() | #include "pycore_object.h"        // _PyObject_GC_UNTRACK() | ||||||
| #include "opcode.h" | #include "opcode.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -10,6 +10,7 @@ | ||||||
| #include "pycore_pystate.h"       // _Py_IsMainInterpreter() | #include "pycore_pystate.h"       // _Py_IsMainInterpreter() | ||||||
| #include "pycore_tuple.h"         // _PyTuple_ITEMS() | #include "pycore_tuple.h"         // _PyTuple_ITEMS() | ||||||
| #include "pycore_pyerrors.h"      // _Py_CalculateSuggestions() | #include "pycore_pyerrors.h"      // _Py_CalculateSuggestions() | ||||||
|  | #include "pycore_unicodeobject.h" // _PyUnicode_InternImmortal | ||||||
| 
 | 
 | ||||||
| /* Export Stable ABIs (abi only) */ | /* Export Stable ABIs (abi only) */ | ||||||
| PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...); | PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...); | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ | ||||||
| #include "pycore_initconfig.h"    // _PyStatus_OK() | #include "pycore_initconfig.h"    // _PyStatus_OK() | ||||||
| #include "pycore_interp.h"        // struct _import_runtime_state | #include "pycore_interp.h"        // struct _import_runtime_state | ||||||
| #include "pycore_magic_number.h"  // PYC_MAGIC_NUMBER_TOKEN | #include "pycore_magic_number.h"  // PYC_MAGIC_NUMBER_TOKEN | ||||||
|  | #include "pycore_moduleobject.h"  // _PyModule_GetDef() | ||||||
| #include "pycore_namespace.h"     // _PyNamespace_Type | #include "pycore_namespace.h"     // _PyNamespace_Type | ||||||
| #include "pycore_object.h"        // _Py_SetImmortal() | #include "pycore_object.h"        // _Py_SetImmortal() | ||||||
| #include "pycore_pyerrors.h"      // _PyErr_SetString() | #include "pycore_pyerrors.h"      // _PyErr_SetString() | ||||||
|  |  | ||||||
|  | @ -4,7 +4,8 @@ | ||||||
| #include "Python.h" | #include "Python.h" | ||||||
| #include "pycore_call.h"          // _PyObject_CallMethod() | #include "pycore_call.h"          // _PyObject_CallMethod() | ||||||
| #include "pycore_import.h"        // _PyImport_SwapPackageContext() | #include "pycore_import.h"        // _PyImport_SwapPackageContext() | ||||||
| #include "pycore_importdl.h"      // struct _Py_ext_module_loader_info | #include "pycore_importdl.h" | ||||||
|  | #include "pycore_moduleobject.h"  // _PyModule_GetDef() | ||||||
| #include "pycore_moduleobject.h"  // _PyModule_GetDef() | #include "pycore_moduleobject.h"  // _PyModule_GetDef() | ||||||
| #include "pycore_pyerrors.h"      // _PyErr_FormatFromCause() | #include "pycore_pyerrors.h"      // _PyErr_FormatFromCause() | ||||||
| #include "pycore_runtime.h"       // _Py_ID() | #include "pycore_runtime.h"       // _Py_ID() | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| #include "pycore_frame.h" | #include "pycore_frame.h" | ||||||
| #include "pycore_long.h" | #include "pycore_long.h" | ||||||
| #include "pycore_optimizer.h" | #include "pycore_optimizer.h" | ||||||
|  | #include "pycore_tuple.h"         // _PyTuple_FromArray() | ||||||
| 
 | 
 | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ | ||||||
| #include "pycore_audit.h"         // _PySys_Audit() | #include "pycore_audit.h"         // _PySys_Audit() | ||||||
| #include "pycore_ceval.h"         // _Py_EnterRecursiveCall() | #include "pycore_ceval.h"         // _Py_EnterRecursiveCall() | ||||||
| #include "pycore_compile.h"       // _PyAST_Compile() | #include "pycore_compile.h"       // _PyAST_Compile() | ||||||
|  | #include "pycore_fileutils.h"     // _PyFile_Flush | ||||||
| #include "pycore_interp.h"        // PyInterpreterState.importlib | #include "pycore_interp.h"        // PyInterpreterState.importlib | ||||||
| #include "pycore_object.h"        // _PyDebug_PrintTotalRefs() | #include "pycore_object.h"        // _PyDebug_PrintTotalRefs() | ||||||
| #include "pycore_parser.h"        // _PyParser_ASTFromString() | #include "pycore_parser.h"        // _PyParser_ASTFromString() | ||||||
|  |  | ||||||
|  | @ -6,7 +6,9 @@ | ||||||
| #include "pycore_critical_section.h" | #include "pycore_critical_section.h" | ||||||
| #include "pycore_descrobject.h"   // _PyMethodWrapper_Type | #include "pycore_descrobject.h"   // _PyMethodWrapper_Type | ||||||
| #include "pycore_dict.h"          // DICT_KEYS_UNICODE | #include "pycore_dict.h"          // DICT_KEYS_UNICODE | ||||||
|  | #include "pycore_frame.h"         // FRAME_SPECIALS_SIZE | ||||||
| #include "pycore_function.h"      // _PyFunction_GetVersionForCurrentState() | #include "pycore_function.h"      // _PyFunction_GetVersionForCurrentState() | ||||||
|  | #include "pycore_list.h"          // _PyListIterObject | ||||||
| #include "pycore_long.h"          // _PyLong_IsNonNegativeCompact() | #include "pycore_long.h"          // _PyLong_IsNonNegativeCompact() | ||||||
| #include "pycore_moduleobject.h" | #include "pycore_moduleobject.h" | ||||||
| #include "pycore_object.h" | #include "pycore_object.h" | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| #include "pycore_pystate.h"       // _PyThreadState_GET() | #include "pycore_pystate.h"       // _PyThreadState_GET() | ||||||
| #include "pycore_runtime.h"       // _Py_ID() | #include "pycore_runtime.h"       // _Py_ID() | ||||||
| #include "pycore_symtable.h"      // PySTEntryObject | #include "pycore_symtable.h"      // PySTEntryObject | ||||||
| #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString() | #include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString | ||||||
| 
 | 
 | ||||||
| #include <stddef.h>               // offsetof() | #include <stddef.h>               // offsetof() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mark Shannon
						Mark Shannon