Skip to content

Commit

Permalink
pythongh-105148: make _PyASTOptimizeState internal to ast_opt.c
Browse files Browse the repository at this point in the history
  • Loading branch information
iritkatriel committed May 31, 2023
1 parent fbc9d0d commit 4fd0ffa
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 26 deletions.
11 changes: 2 additions & 9 deletions Include/internal/pycore_compile.h
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
26 changes: 19 additions & 7 deletions 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)
{
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
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
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

0 comments on commit 4fd0ffa

Please sign in to comment.