bpo-39639: Remove the AST "Suite" node and associated code (GH-18513)

The AST "Suite" node is no longer used and it can be removed from the ASDL definition and related structures (compiler, visitors, ...).

Co-Authored-By: Victor Stinner <vstinner@python.org>
Co-authored-by: Brett Cannon <54418+brettcannon@users.noreply.github.com>
Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
This commit is contained in:
Batuhan Taşkaya 2020-03-04 19:16:47 +03:00 committed by GitHub
parent 702e09fd0a
commit d82e469048
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 7 additions and 106 deletions

View file

@ -611,6 +611,9 @@ Removed
defining ``COUNT_ALLOCS`` macro. defining ``COUNT_ALLOCS`` macro.
(Contributed by Victor Stinner in :issue:`39489`.) (Contributed by Victor Stinner in :issue:`39489`.)
* The ``ast.Suite`` node class has been removed due to no longer being needed.
(Contributed by Batuhan Taskaya in :issue:`39639`.)
Porting to Python 3.9 Porting to Python 3.9
===================== =====================

8
Include/Python-ast.h generated
View file

@ -51,7 +51,7 @@ typedef struct _type_ignore *type_ignore_ty;
enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3,
FunctionType_kind=4, Suite_kind=5}; FunctionType_kind=4};
struct _mod { struct _mod {
enum _mod_kind kind; enum _mod_kind kind;
union { union {
@ -73,10 +73,6 @@ struct _mod {
expr_ty returns; expr_ty returns;
} FunctionType; } FunctionType;
struct {
asdl_seq *body;
} Suite;
} v; } v;
}; };
@ -483,8 +479,6 @@ mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena);
mod_ty _Py_Expression(expr_ty body, PyArena *arena); mod_ty _Py_Expression(expr_ty body, PyArena *arena);
#define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) #define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2)
mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena); mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena);
#define Suite(a0, a1) _Py_Suite(a0, a1)
mod_ty _Py_Suite(asdl_seq * body, PyArena *arena);
#define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) #define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body,
asdl_seq * decorator_list, expr_ty returns, string asdl_seq * decorator_list, expr_ty returns, string

View file

@ -118,7 +118,7 @@ class TestAsdlParser(unittest.TestCase):
v = CustomVisitor() v = CustomVisitor()
v.visit(self.types['mod']) v.visit(self.types['mod'])
self.assertEqual(v.names_with_seq, self.assertEqual(v.names_with_seq,
['Module', 'Module', 'Interactive', 'FunctionType', 'Suite']) ['Module', 'Module', 'Interactive', 'FunctionType'])
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -0,0 +1 @@
Remove ``ast.Suite`` node class because it's no longer used. Patch by Batuhan Taskaya.

View file

@ -3,14 +3,11 @@
module Python module Python
{ {
mod = Module(stmt* body, type_ignore *type_ignores) mod = Module(stmt* body, type_ignore* type_ignores)
| Interactive(stmt* body) | Interactive(stmt* body)
| Expression(expr body) | Expression(expr body)
| FunctionType(expr* argtypes, expr returns) | FunctionType(expr* argtypes, expr returns)
-- not really an actual node but useful in Jython's typesystem.
| Suite(stmt* body)
stmt = FunctionDef(identifier name, arguments args, stmt = FunctionDef(identifier name, arguments args,
stmt* body, expr* decorator_list, expr? returns, stmt* body, expr* decorator_list, expr? returns,
string? type_comment) string? type_comment)
@ -51,7 +48,6 @@ module Python
| Expr(expr value) | Expr(expr value)
| Pass | Break | Continue | Pass | Break | Continue
-- XXX Jython will be different
-- col_offset is the byte offset in the utf8 string the parser uses -- col_offset is the byte offset in the utf8 string the parser uses
attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset)

79
Python/Python-ast.c generated
View file

@ -127,7 +127,6 @@ typedef struct {
PyObject *Sub_singleton; PyObject *Sub_singleton;
PyObject *Sub_type; PyObject *Sub_type;
PyObject *Subscript_type; PyObject *Subscript_type;
PyObject *Suite_type;
PyObject *Try_type; PyObject *Try_type;
PyObject *Tuple_type; PyObject *Tuple_type;
PyObject *TypeIgnore_type; PyObject *TypeIgnore_type;
@ -357,7 +356,6 @@ static int astmodule_clear(PyObject *module)
Py_CLEAR(astmodulestate(module)->Sub_singleton); Py_CLEAR(astmodulestate(module)->Sub_singleton);
Py_CLEAR(astmodulestate(module)->Sub_type); Py_CLEAR(astmodulestate(module)->Sub_type);
Py_CLEAR(astmodulestate(module)->Subscript_type); Py_CLEAR(astmodulestate(module)->Subscript_type);
Py_CLEAR(astmodulestate(module)->Suite_type);
Py_CLEAR(astmodulestate(module)->Try_type); Py_CLEAR(astmodulestate(module)->Try_type);
Py_CLEAR(astmodulestate(module)->Tuple_type); Py_CLEAR(astmodulestate(module)->Tuple_type);
Py_CLEAR(astmodulestate(module)->TypeIgnore_type); Py_CLEAR(astmodulestate(module)->TypeIgnore_type);
@ -586,7 +584,6 @@ static int astmodule_traverse(PyObject *module, visitproc visit, void* arg)
Py_VISIT(astmodulestate(module)->Sub_singleton); Py_VISIT(astmodulestate(module)->Sub_singleton);
Py_VISIT(astmodulestate(module)->Sub_type); Py_VISIT(astmodulestate(module)->Sub_type);
Py_VISIT(astmodulestate(module)->Subscript_type); Py_VISIT(astmodulestate(module)->Subscript_type);
Py_VISIT(astmodulestate(module)->Suite_type);
Py_VISIT(astmodulestate(module)->Try_type); Py_VISIT(astmodulestate(module)->Try_type);
Py_VISIT(astmodulestate(module)->Tuple_type); Py_VISIT(astmodulestate(module)->Tuple_type);
Py_VISIT(astmodulestate(module)->TypeIgnore_type); Py_VISIT(astmodulestate(module)->TypeIgnore_type);
@ -807,9 +804,6 @@ static const char * const FunctionType_fields[]={
"argtypes", "argtypes",
"returns", "returns",
}; };
static const char * const Suite_fields[]={
"body",
};
static const char * const stmt_attributes[] = { static const char * const stmt_attributes[] = {
"lineno", "lineno",
"col_offset", "col_offset",
@ -1442,8 +1436,6 @@ static int init_types(void)
state->FunctionType_type = make_type("FunctionType", state->mod_type, state->FunctionType_type = make_type("FunctionType", state->mod_type,
FunctionType_fields, 2); FunctionType_fields, 2);
if (!state->FunctionType_type) return 0; if (!state->FunctionType_type) return 0;
state->Suite_type = make_type("Suite", state->mod_type, Suite_fields, 1);
if (!state->Suite_type) return 0;
state->stmt_type = make_type("stmt", state->AST_type, NULL, 0); state->stmt_type = make_type("stmt", state->AST_type, NULL, 0);
if (!state->stmt_type) return 0; if (!state->stmt_type) return 0;
if (!add_attributes(state->stmt_type, stmt_attributes, 4)) return 0; if (!add_attributes(state->stmt_type, stmt_attributes, 4)) return 0;
@ -1920,18 +1912,6 @@ FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena)
return p; return p;
} }
mod_ty
Suite(asdl_seq * body, PyArena *arena)
{
mod_ty p;
p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
if (!p)
return NULL;
p->kind = Suite_kind;
p->v.Suite.body = body;
return p;
}
stmt_ty stmt_ty
FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
decorator_list, expr_ty returns, string type_comment, int lineno, decorator_list, expr_ty returns, string type_comment, int lineno,
@ -3416,16 +3396,6 @@ ast2obj_mod(void* _o)
goto failed; goto failed;
Py_DECREF(value); Py_DECREF(value);
break; break;
case Suite_kind:
tp = (PyTypeObject *)astmodulestate_global->Suite_type;
result = PyType_GenericNew(tp, NULL, NULL);
if (!result) goto failed;
value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
if (!value) goto failed;
if (PyObject_SetAttr(result, astmodulestate_global->body, value) == -1)
goto failed;
Py_DECREF(value);
break;
} }
return result; return result;
failed: failed:
@ -5201,51 +5171,6 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
if (*out == NULL) goto failed; if (*out == NULL) goto failed;
return 0; return 0;
} }
tp = astmodulestate_global->Suite_type;
isinstance = PyObject_IsInstance(obj, tp);
if (isinstance == -1) {
return 1;
}
if (isinstance) {
asdl_seq* body;
if (_PyObject_LookupAttr(obj, astmodulestate_global->body, &tmp) < 0) {
return 1;
}
if (tmp == NULL) {
PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
return 1;
}
else {
int res;
Py_ssize_t len;
Py_ssize_t i;
if (!PyList_Check(tmp)) {
PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", _PyType_Name(Py_TYPE(tmp)));
goto failed;
}
len = PyList_GET_SIZE(tmp);
body = _Py_asdl_seq_new(len, arena);
if (body == NULL) goto failed;
for (i = 0; i < len; i++) {
stmt_ty val;
PyObject *tmp2 = PyList_GET_ITEM(tmp, i);
Py_INCREF(tmp2);
res = obj2ast_stmt(tmp2, &val, arena);
Py_DECREF(tmp2);
if (res != 0) goto failed;
if (len != PyList_GET_SIZE(tmp)) {
PyErr_SetString(PyExc_RuntimeError, "Suite field \"body\" changed size during iteration");
goto failed;
}
asdl_seq_SET(body, i, val);
}
Py_CLEAR(tmp);
}
*out = Suite(body, arena);
if (*out == NULL) goto failed;
return 0;
}
PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj); PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %R", obj);
failed: failed:
@ -9924,10 +9849,6 @@ PyInit__ast(void)
goto error; goto error;
} }
Py_INCREF(astmodulestate(m)->FunctionType_type); Py_INCREF(astmodulestate(m)->FunctionType_type);
if (PyModule_AddObject(m, "Suite", astmodulestate_global->Suite_type) < 0) {
goto error;
}
Py_INCREF(astmodulestate(m)->Suite_type);
if (PyModule_AddObject(m, "stmt", astmodulestate_global->stmt_type) < 0) { if (PyModule_AddObject(m, "stmt", astmodulestate_global->stmt_type) < 0) {
goto error; goto error;
} }

View file

@ -545,9 +545,6 @@ PyAST_Validate(mod_ty mod)
case Expression_kind: case Expression_kind:
res = validate_expr(mod->v.Expression.body, Load); res = validate_expr(mod->v.Expression.body, Load);
break; break;
case Suite_kind:
PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
break;
default: default:
PyErr_SetString(PyExc_SystemError, "impossible module node"); PyErr_SetString(PyExc_SystemError, "impossible module node");
res = 0; res = 0;

View file

@ -462,9 +462,6 @@ astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_)
case Expression_kind: case Expression_kind:
CALL(astfold_expr, expr_ty, node_->v.Expression.body); CALL(astfold_expr, expr_ty, node_->v.Expression.body);
break; break;
case Suite_kind:
CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Suite.body);
break;
default: default:
break; break;
} }

View file

@ -1862,10 +1862,6 @@ compiler_mod(struct compiler *c, mod_ty mod)
VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
addNone = 0; addNone = 0;
break; break;
case Suite_kind:
PyErr_SetString(PyExc_SystemError,
"suite should not be possible");
return 0;
default: default:
PyErr_Format(PyExc_SystemError, PyErr_Format(PyExc_SystemError,
"module kind %d should not be possible", "module kind %d should not be possible",

View file

@ -318,10 +318,6 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future)
(stmt_ty)asdl_seq_GET(seq, i))) (stmt_ty)asdl_seq_GET(seq, i)))
goto error; goto error;
break; break;
case Suite_kind:
PyErr_SetString(PyExc_RuntimeError,
"this compiler does not handle Suites");
goto error;
case FunctionType_kind: case FunctionType_kind:
PyErr_SetString(PyExc_RuntimeError, PyErr_SetString(PyExc_RuntimeError,
"this compiler does not handle FunctionTypes"); "this compiler does not handle FunctionTypes");