Skip to content

gh-105148: make _PyASTOptimizeState internal to ast_opt.c #105149

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 2 additions & 9 deletions Include/internal/pycore_compile.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
26 changes: 19 additions & 7 deletions Python/ast_opt.c
Original file line number Diff line number Diff line change
@@ -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)
{
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
6 changes: 1 addition & 5 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 1 addition & 5 deletions Python/traceback.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down