mirror of
https://github.com/python/cpython.git
synced 2024-11-23 18:04:37 +08:00
gh-105148: make _PyASTOptimizeState internal to ast_opt.c (#105149)
This commit is contained in:
parent
dd29ae26f8
commit
f990bb8b2d
@ -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;
|
||||
|
@ -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.
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user