https://github.com/python/cpython/commit/b8367e7cf3d740fdc401902b502c0ef2ccc6197c commit: b8367e7cf3d740fdc401902b502c0ef2ccc6197c branch: main author: Victor Stinner <vstin...@python.org> committer: vstinner <vstin...@python.org> date: 2025-03-19T15:23:32+01:00 summary:
gh-130931: Add pycore_typedefs.h internal header (#131396) Declare _PyInterpreterFrame and _PyRuntimeState types before declaring their structure members. Break reference cycles between header files. files: A Include/internal/pycore_typedefs.h M Include/internal/pycore_ceval.h M Include/internal/pycore_frame.h M Include/internal/pycore_gc.h M Include/internal/pycore_genobject.h M Include/internal/pycore_initconfig.h M Include/internal/pycore_instruments.h M Include/internal/pycore_interp_structs.h M Include/internal/pycore_optimizer.h M Include/internal/pycore_pylifecycle.h M Include/internal/pycore_runtime_structs.h M Makefile.pre.in M PCbuild/pythoncore.vcxproj M PCbuild/pythoncore.vcxproj.filters diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index 5618539f2df73e..436e5dc1d7dce8 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -12,9 +12,10 @@ extern "C" { #include "pycore_interp.h" // PyInterpreterState.eval_frame #include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_typedefs.h" // _PyInterpreterFrame + /* Forward declarations */ -struct pyruntimestate; struct _ceval_runtime_state; // Export for '_lsprof' shared extension @@ -109,7 +110,7 @@ extern _PyPerf_Callbacks _Py_perfmap_jit_callbacks; #endif static inline PyObject* -_PyEval_EvalFrame(PyThreadState *tstate, struct _PyInterpreterFrame *frame, int throwflag) +_PyEval_EvalFrame(PyThreadState *tstate, _PyInterpreterFrame *frame, int throwflag) { EVAL_CALL_STAT_INC(EVAL_CALL_TOTAL); if (tstate->interp->eval_frame == NULL) { @@ -256,7 +257,7 @@ static inline int _Py_ReachedRecursionLimit(PyThreadState *tstate) { static inline void _Py_LeaveRecursiveCall(void) { } -extern struct _PyInterpreterFrame* _PyEval_GetFrame(void); +extern _PyInterpreterFrame* _PyEval_GetFrame(void); PyAPI_FUNC(PyObject *)_Py_MakeCoro(PyFunctionObject *func); diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h index fc395d8a4491fe..31a98723baf7bf 100644 --- a/Include/internal/pycore_frame.h +++ b/Include/internal/pycore_frame.h @@ -13,6 +13,7 @@ extern "C" { #include "pycore_code.h" // STATS #include "pycore_stackref.h" // _PyStackRef #include "pycore_stats.h" +#include "pycore_typedefs.h" // _PyInterpreterFrame /* See InternalDocs/frames.md for an explanation of the frame stack * including explanation of the PyFrameObject and _PyInterpreterFrame @@ -22,7 +23,7 @@ extern "C" { struct _frame { PyObject_HEAD PyFrameObject *f_back; /* previous frame, or NULL */ - struct _PyInterpreterFrame *f_frame; /* points to the frame data */ + _PyInterpreterFrame *f_frame; /* points to the frame data */ PyObject *f_trace; /* Trace function */ int f_lineno; /* Current line number. Only valid if non-zero */ char f_trace_lines; /* Emit per-line trace events? */ @@ -61,7 +62,7 @@ enum _frameowner { FRAME_OWNED_BY_CSTACK = 4, }; -typedef struct _PyInterpreterFrame { +struct _PyInterpreterFrame { _PyStackRef f_executable; /* Deferred or strong reference (code object or None) */ struct _PyInterpreterFrame *previous; _PyStackRef f_funcobj; /* Deferred or strong reference. Only valid if not on C stack */ @@ -85,7 +86,7 @@ typedef struct _PyInterpreterFrame { #endif /* Locals and stack */ _PyStackRef localsplus[1]; -} _PyInterpreterFrame; +}; #define _PyInterpreterFrame_LASTI(IF) \ ((int)((IF)->instr_ptr - _PyFrame_GetBytecode((IF)))) diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index 107a86178a4d7f..c33b98cdc43fb4 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -8,8 +8,9 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_runtime_structs.h" #include "pycore_pystate.h" +#include "pycore_runtime_structs.h" +#include "pycore_typedefs.h" // _PyInterpreterFrame /* Get an object's GC head */ @@ -348,7 +349,7 @@ extern void _Py_RunGC(PyThreadState *tstate); union _PyStackRef; // GC visit callback for tracked interpreter frames -extern int _PyGC_VisitFrameStack(struct _PyInterpreterFrame *frame, visitproc visit, void *arg); +extern int _PyGC_VisitFrameStack(_PyInterpreterFrame *frame, visitproc visit, void *arg); extern int _PyGC_VisitStackRef(union _PyStackRef *ref, visitproc visit, void *arg); // Like Py_VISIT but for _PyStackRef fields diff --git a/Include/internal/pycore_genobject.h b/Include/internal/pycore_genobject.h index f6d7e6d367177b..b0472c5b9ead36 100644 --- a/Include/internal/pycore_genobject.h +++ b/Include/internal/pycore_genobject.h @@ -9,6 +9,8 @@ extern "C" { #endif #include "pycore_frame.h" +#include "pycore_typedefs.h" // _PyInterpreterFrame + /* _PyGenObject_HEAD defines the initial segment of generator and coroutine objects. */ @@ -27,7 +29,7 @@ extern "C" { char prefix##_running_async; \ /* The frame */ \ int8_t prefix##_frame_state; \ - struct _PyInterpreterFrame prefix##_iframe; \ + _PyInterpreterFrame prefix##_iframe; \ struct _PyGenObject { /* The gi_ prefix is intended to remind of generator-iterator. */ diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index 25ec8cec3bd249..368dafb90635d7 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -8,8 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -/* Forward declaration */ -struct pyruntimestate; +#include "pycore_typedefs.h" // _PyRuntimeState /* --- PyStatus ----------------------------------------------- */ @@ -177,7 +176,7 @@ extern PyStatus _PyConfig_InitPathConfig( extern PyStatus _PyConfig_InitImportConfig(PyConfig *config); extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config); extern PyStatus _PyConfig_Write(const PyConfig *config, - struct pyruntimestate *runtime); + _PyRuntimeState *runtime); extern PyStatus _PyConfig_SetPyArgv( PyConfig *config, const _PyArgv *args); diff --git a/Include/internal/pycore_instruments.h b/Include/internal/pycore_instruments.h index 0e85f97073dd67..7658adca719e86 100644 --- a/Include/internal/pycore_instruments.h +++ b/Include/internal/pycore_instruments.h @@ -6,6 +6,7 @@ #endif #include "pycore_structs.h" // _Py_CODEUNIT +#include "pycore_typedefs.h" // _PyInterpreterFrame #ifdef __cplusplus extern "C" { @@ -34,32 +35,32 @@ int _PyMonitoring_GetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringE extern int _Py_call_instrumentation(PyThreadState *tstate, int event, - struct _PyInterpreterFrame *frame, _Py_CODEUNIT *instr); + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr); extern int -_Py_call_instrumentation_line(PyThreadState *tstate, struct _PyInterpreterFrame* frame, +_Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr, _Py_CODEUNIT *prev); extern int _Py_call_instrumentation_instruction( - PyThreadState *tstate, struct _PyInterpreterFrame* frame, _Py_CODEUNIT *instr); + PyThreadState *tstate, _PyInterpreterFrame* frame, _Py_CODEUNIT *instr); _Py_CODEUNIT * _Py_call_instrumentation_jump( _Py_CODEUNIT *instr, PyThreadState *tstate, int event, - struct _PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest); + _PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest); extern int _Py_call_instrumentation_arg(PyThreadState *tstate, int event, - struct _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg); + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg); extern int _Py_call_instrumentation_2args(PyThreadState *tstate, int event, - struct _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); extern void _Py_call_instrumentation_exc2(PyThreadState *tstate, int event, - struct _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); + _PyInterpreterFrame *frame, _Py_CODEUNIT *instr, PyObject *arg0, PyObject *arg1); extern int _Py_Instrumentation_GetLine(PyCodeObject *code, int index); diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index ec788de316fcef..bdeb7f0199853b 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -4,10 +4,11 @@ extern "C" { #endif -#include "pycore_structs.h" -#include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR -#include "pycore_llist.h" #include "pycore_ast_state.h" // struct ast_state +#include "pycore_llist.h" +#include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR +#include "pycore_structs.h" +#include "pycore_typedefs.h" // _PyRuntimeState /* This file contains the struct definitions for interpreter state @@ -802,7 +803,7 @@ struct _is { /* Reference to the _PyRuntime global variable. This field exists to not have to pass runtime in addition to tstate to a function. Get runtime from tstate: tstate->interp->runtime. */ - struct pyruntimestate *runtime; + _PyRuntimeState *runtime; /* Set by Py_EndInterpreter(). diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index 79861167f65e63..03c2708e0a0505 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -8,6 +8,7 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_typedefs.h" // _PyInterpreterFrame #include "pycore_uop_ids.h" #include <stdbool.h> @@ -117,7 +118,7 @@ PyAPI_FUNC(void) _Py_Executors_InvalidateCold(PyInterpreterState *interp); #define TRACE_STACK_SIZE 5 -int _Py_uop_analyze_and_optimize(struct _PyInterpreterFrame *frame, +int _Py_uop_analyze_and_optimize(_PyInterpreterFrame *frame, _PyUOpInstruction *trace, int trace_len, int curr_stackentries, _PyBloomFilter *dependencies); @@ -291,7 +292,7 @@ extern int _Py_uop_frame_pop(JitOptContext *ctx); PyAPI_FUNC(PyObject *) _Py_uop_symbols_test(PyObject *self, PyObject *ignored); -PyAPI_FUNC(int) _PyOptimizer_Optimize(struct _PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyExecutorObject **exec_ptr, int chain_depth); +PyAPI_FUNC(int) _PyOptimizer_Optimize(_PyInterpreterFrame *frame, _Py_CODEUNIT *start, _PyExecutorObject **exec_ptr, int chain_depth); static inline int is_terminator(const _PyUOpInstruction *uop) { diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index a5f9418ec05718..53ffe7f8fecdba 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -12,7 +12,6 @@ extern "C" { /* Forward declarations */ struct _PyArgv; -struct pyruntimestate; extern int _Py_SetFileSystemEncoding( const char *encoding, diff --git a/Include/internal/pycore_runtime_structs.h b/Include/internal/pycore_runtime_structs.h index 2ea1d795f24789..81f53afa3c080d 100644 --- a/Include/internal/pycore_runtime_structs.h +++ b/Include/internal/pycore_runtime_structs.h @@ -143,7 +143,7 @@ struct _Py_static_objects { That data is exported by the internal API as a global variable (_PyRuntime, defined near the top of pylifecycle.c). */ -typedef struct pyruntimestate { +struct pyruntimestate { /* This field must be first to facilitate locating it by out of process * debuggers. Out of process debuggers will use the offsets contained in this * field to be able to locate other fields in several interpreter structures @@ -307,7 +307,7 @@ typedef struct pyruntimestate { PyInterpreterState _main_interpreter; // _main_interpreter should be the last field of _PyRuntimeState. // See https://github.com/python/cpython/issues/127117. -} _PyRuntimeState; +}; diff --git a/Include/internal/pycore_typedefs.h b/Include/internal/pycore_typedefs.h new file mode 100644 index 00000000000000..d330cc4dc2b8fa --- /dev/null +++ b/Include/internal/pycore_typedefs.h @@ -0,0 +1,18 @@ +#ifndef Py_INTERNAL_TYPEDEFS_H +#define Py_INTERNAL_TYPEDEFS_H + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _PyInterpreterFrame _PyInterpreterFrame; +typedef struct pyruntimestate _PyRuntimeState; + +#ifdef __cplusplus +} +#endif +#endif // !Py_INTERNAL_TYPEDEFS_H diff --git a/Makefile.pre.in b/Makefile.pre.in index 05ff1b959bdbaa..076312807f3cc7 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1316,6 +1316,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_tracemalloc.h \ $(srcdir)/Include/internal/pycore_tstate.h \ $(srcdir)/Include/internal/pycore_tuple.h \ + $(srcdir)/Include/internal/pycore_typedefs.h \ $(srcdir)/Include/internal/pycore_uniqueid.h \ $(srcdir)/Include/internal/pycore_typeobject.h \ $(srcdir)/Include/internal/pycore_typevarobject.h \ diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 3a06d71d8aa6d8..2a245e931fc9b8 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -311,6 +311,7 @@ <ClInclude Include="..\Include\internal\pycore_tracemalloc.h" /> <ClInclude Include="..\Include\internal\pycore_tstate.h" /> <ClInclude Include="..\Include\internal\pycore_tuple.h" /> + <ClInclude Include="..\Include\internal\pycore_typedefs.h" /> <ClInclude Include="..\Include\internal\pycore_typeobject.h" /> <ClInclude Include="..\Include\internal\pycore_typevarobject.h" /> <ClInclude Include="..\Include\internal\pycore_ucnhash.h" /> diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 14eebd978db73e..28cd3ec507ac33 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -843,6 +843,9 @@ <ClInclude Include="..\Include\internal\pycore_tuple.h"> <Filter>Include\internal</Filter> </ClInclude> + <ClInclude Include="..\Include\internal\pycore_typedefs.h"> + <Filter>Include\internal</Filter> + </ClInclude> <ClInclude Include="..\Include\internal\pycore_typeobject.h"> <Filter>Include\internal</Filter> </ClInclude> _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com