From 4fd0ffa2422223a82c2cdeda7be4f64910607d3e Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 31 May 2023 16:18:33 +0100 Subject: [PATCH 1/2] gh-105148: make _PyASTOptimizeState internal to ast_opt.c --- Include/internal/pycore_compile.h | 11 ++--------- Python/ast_opt.c | 26 +++++++++++++++++++------- Python/compile.c | 6 +----- Python/traceback.c | 6 +----- 4 files changed, 23 insertions(+), 26 deletions(-) diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h index 80a637e5bf9aed..e6481734a675c6 100644 --- a/Include/internal/pycore_compile.h +++ b/Include/internal/pycore_compile.h @@ -21,18 +21,11 @@ PyAPI_FUNC(PyCodeObject*) _PyAST_Compile( static const _PyCompilerSrcLocation NO_LOCATION = {-1, -1, -1, -1}; -typedef struct { - int optimize; - int ff_features; - - int recursion_depth; /* current recursion depth */ - int recursion_limit; /* recursion limit */ -} _PyASTOptimizeState; - extern int _PyAST_Optimize( struct _mod *, struct _arena *arena, - _PyASTOptimizeState *state); + int optimize, + int ff_features); typedef struct { int h_offset; diff --git a/Python/ast_opt.c b/Python/ast_opt.c index 274bd134e1435b..276e910089a277 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -1,12 +1,20 @@ /* AST Optimizer */ #include "Python.h" #include "pycore_ast.h" // _PyAST_GetDocString() -#include "pycore_compile.h" // _PyASTOptimizeState #include "pycore_long.h" // _PyLong #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_format.h" // F_LJUST +typedef struct { + int optimize; + int ff_features; + + int recursion_depth; /* current recursion depth */ + int recursion_limit; /* recursion limit */ +} _PyASTOptimizeState; + + static int make_const(expr_ty node, PyObject *val, PyArena *arena) { @@ -1106,11 +1114,15 @@ astfold_type_param(type_param_ty node_, PyArena *ctx_, _PyASTOptimizeState *stat #define COMPILER_STACK_FRAME_SCALE 3 int -_PyAST_Optimize(mod_ty mod, PyArena *arena, _PyASTOptimizeState *state) +_PyAST_Optimize(mod_ty mod, PyArena *arena, int optimize, int ff_features) { PyThreadState *tstate; int starting_recursion_depth; + _PyASTOptimizeState state; + state.optimize = optimize; + state.ff_features = ff_features; + /* Setup recursion depth check counters */ tstate = _PyThreadState_GET(); if (!tstate) { @@ -1119,17 +1131,17 @@ _PyAST_Optimize(mod_ty mod, PyArena *arena, _PyASTOptimizeState *state) /* Be careful here to prevent overflow. */ int recursion_depth = C_RECURSION_LIMIT - tstate->c_recursion_remaining; starting_recursion_depth = recursion_depth * COMPILER_STACK_FRAME_SCALE; - state->recursion_depth = starting_recursion_depth; - state->recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; + state.recursion_depth = starting_recursion_depth; + state.recursion_limit = C_RECURSION_LIMIT * COMPILER_STACK_FRAME_SCALE; - int ret = astfold_mod(mod, arena, state); + int ret = astfold_mod(mod, arena, &state); assert(ret || PyErr_Occurred()); /* Check that the recursion depth counting balanced correctly */ - if (ret && state->recursion_depth != starting_recursion_depth) { + if (ret && state.recursion_depth != starting_recursion_depth) { PyErr_Format(PyExc_SystemError, "AST optimizer recursion depth mismatch (before=%d, after=%d)", - starting_recursion_depth, state->recursion_depth); + starting_recursion_depth, state.recursion_depth); return 0; } diff --git a/Python/compile.c b/Python/compile.c index f2314ae11c417b..8f20e39315fb3f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -534,11 +534,7 @@ compiler_setup(struct compiler *c, mod_ty mod, PyObject *filename, c->c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize; c->c_nestlevel = 0; - _PyASTOptimizeState state; - state.optimize = c->c_optimize; - state.ff_features = merged; - - if (!_PyAST_Optimize(mod, arena, &state)) { + if (!_PyAST_Optimize(mod, arena, c->c_optimize, merged)) { return ERROR; } c->c_st = _PySymtable_Build(mod, filename, &c->c_future); diff --git a/Python/traceback.c b/Python/traceback.c index b2479542047308..a58df04b346010 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -675,16 +675,12 @@ extract_anchors_from_line(PyObject *filename, PyObject *line, PyCompilerFlags flags = _PyCompilerFlags_INIT; - _PyASTOptimizeState state; - state.optimize = _Py_GetConfig()->optimization_level; - state.ff_features = 0; - mod_ty module = _PyParser_ASTFromString(segment_str, filename, Py_file_input, &flags, arena); if (!module) { goto done; } - if (!_PyAST_Optimize(module, arena, &state)) { + if (!_PyAST_Optimize(module, arena, _Py_GetConfig()->optimization_level, 0)) { goto done; } From 07186ace7998cfbdc10cfd64de86d23899446f64 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Wed, 31 May 2023 16:22:39 +0100 Subject: [PATCH 2/2] add news --- .../2023-05-31-16-22-29.gh-issue-105148.MOlb1d.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-05-31-16-22-29.gh-issue-105148.MOlb1d.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-05-31-16-22-29.gh-issue-105148.MOlb1d.rst b/Misc/NEWS.d/next/Core and Builtins/2023-05-31-16-22-29.gh-issue-105148.MOlb1d.rst new file mode 100644 index 00000000000000..4dcdcdfd4287d7 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-05-31-16-22-29.gh-issue-105148.MOlb1d.rst @@ -0,0 +1,3 @@ +Make ``_PyASTOptimizeState`` internal to ast_opt.c. Make ``_PyAST_Optimize`` +take two integers instead of a pointer to this struct. This avoids the need +to include pycore_compile.h in ast_opt.c.