From d82e469048e0e034d8c0020cd33b733be1adf68b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Wed, 4 Mar 2020 19:16:47 +0300 Subject: 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 Co-authored-by: Brett Cannon <54418+brettcannon@users.noreply.github.com> Co-authored-by: Pablo Galindo --- Doc/whatsnew/3.9.rst | 3 + Include/Python-ast.h | 8 +-- Lib/test/test_asdl_parser.py | 2 +- .../2020-02-15-15-29-34.bpo-39639.3mqJjm.rst | 1 + Parser/Python.asdl | 6 +- Python/Python-ast.c | 79 ---------------------- Python/ast.c | 3 - Python/ast_opt.c | 3 - Python/compile.c | 4 -- Python/symtable.c | 4 -- 10 files changed, 7 insertions(+), 106 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-02-15-15-29-34.bpo-39639.3mqJjm.rst diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index f15805c..d072b8d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -611,6 +611,9 @@ Removed defining ``COUNT_ALLOCS`` macro. (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 ===================== diff --git a/Include/Python-ast.h b/Include/Python-ast.h index b9232b1..931a6b9 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -51,7 +51,7 @@ typedef struct _type_ignore *type_ignore_ty; enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, - FunctionType_kind=4, Suite_kind=5}; + FunctionType_kind=4}; struct _mod { enum _mod_kind kind; union { @@ -73,10 +73,6 @@ struct _mod { expr_ty returns; } FunctionType; - struct { - asdl_seq *body; - } Suite; - } v; }; @@ -483,8 +479,6 @@ mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); mod_ty _Py_Expression(expr_ty body, PyArena *arena); #define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) 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) stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, string diff --git a/Lib/test/test_asdl_parser.py b/Lib/test/test_asdl_parser.py index 9eaceec..d3306c2 100644 --- a/Lib/test/test_asdl_parser.py +++ b/Lib/test/test_asdl_parser.py @@ -118,7 +118,7 @@ class TestAsdlParser(unittest.TestCase): v = CustomVisitor() v.visit(self.types['mod']) self.assertEqual(v.names_with_seq, - ['Module', 'Module', 'Interactive', 'FunctionType', 'Suite']) + ['Module', 'Module', 'Interactive', 'FunctionType']) if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-02-15-15-29-34.bpo-39639.3mqJjm.rst b/Misc/NEWS.d/next/Core and Builtins/2020-02-15-15-29-34.bpo-39639.3mqJjm.rst new file mode 100644 index 0000000..7a54dd0 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-02-15-15-29-34.bpo-39639.3mqJjm.rst @@ -0,0 +1 @@ +Remove ``ast.Suite`` node class because it's no longer used. Patch by Batuhan Taskaya. diff --git a/Parser/Python.asdl b/Parser/Python.asdl index 126d478..bec30a7 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -3,14 +3,11 @@ module Python { - mod = Module(stmt* body, type_ignore *type_ignores) + mod = Module(stmt* body, type_ignore* type_ignores) | Interactive(stmt* body) | Expression(expr body) | 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* body, expr* decorator_list, expr? returns, string? type_comment) @@ -51,7 +48,6 @@ module Python | Expr(expr value) | Pass | Break | Continue - -- XXX Jython will be different -- 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) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index e9925e7..2784c42 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -127,7 +127,6 @@ typedef struct { PyObject *Sub_singleton; PyObject *Sub_type; PyObject *Subscript_type; - PyObject *Suite_type; PyObject *Try_type; PyObject *Tuple_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_type); Py_CLEAR(astmodulestate(module)->Subscript_type); - Py_CLEAR(astmodulestate(module)->Suite_type); Py_CLEAR(astmodulestate(module)->Try_type); Py_CLEAR(astmodulestate(module)->Tuple_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_type); Py_VISIT(astmodulestate(module)->Subscript_type); - Py_VISIT(astmodulestate(module)->Suite_type); Py_VISIT(astmodulestate(module)->Try_type); Py_VISIT(astmodulestate(module)->Tuple_type); Py_VISIT(astmodulestate(module)->TypeIgnore_type); @@ -807,9 +804,6 @@ static const char * const FunctionType_fields[]={ "argtypes", "returns", }; -static const char * const Suite_fields[]={ - "body", -}; static const char * const stmt_attributes[] = { "lineno", "col_offset", @@ -1442,8 +1436,6 @@ static int init_types(void) state->FunctionType_type = make_type("FunctionType", state->mod_type, FunctionType_fields, 2); 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); if (!state->stmt_type) 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; } -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 FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, string type_comment, int lineno, @@ -3416,16 +3396,6 @@ ast2obj_mod(void* _o) goto failed; Py_DECREF(value); 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; failed: @@ -5201,51 +5171,6 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; 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); failed: @@ -9924,10 +9849,6 @@ PyInit__ast(void) goto error; } 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) { goto error; } diff --git a/Python/ast.c b/Python/ast.c index 0aed54c..43b50c5 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -545,9 +545,6 @@ PyAST_Validate(mod_ty mod) case Expression_kind: res = validate_expr(mod->v.Expression.body, Load); break; - case Suite_kind: - PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler"); - break; default: PyErr_SetString(PyExc_SystemError, "impossible module node"); res = 0; diff --git a/Python/ast_opt.c b/Python/ast_opt.c index f2a2c25..39e164a 100644 --- a/Python/ast_opt.c +++ b/Python/ast_opt.c @@ -462,9 +462,6 @@ astfold_mod(mod_ty node_, PyArena *ctx_, int optimize_) case Expression_kind: CALL(astfold_expr, expr_ty, node_->v.Expression.body); break; - case Suite_kind: - CALL_SEQ(astfold_stmt, stmt_ty, node_->v.Suite.body); - break; default: break; } diff --git a/Python/compile.c b/Python/compile.c index bf8c810..f603e3d 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1862,10 +1862,6 @@ compiler_mod(struct compiler *c, mod_ty mod) VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); addNone = 0; break; - case Suite_kind: - PyErr_SetString(PyExc_SystemError, - "suite should not be possible"); - return 0; default: PyErr_Format(PyExc_SystemError, "module kind %d should not be possible", diff --git a/Python/symtable.c b/Python/symtable.c index 30482d9..a98a0fa 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -318,10 +318,6 @@ PySymtable_BuildObject(mod_ty mod, PyObject *filename, PyFutureFeatures *future) (stmt_ty)asdl_seq_GET(seq, i))) goto error; break; - case Suite_kind: - PyErr_SetString(PyExc_RuntimeError, - "this compiler does not handle Suites"); - goto error; case FunctionType_kind: PyErr_SetString(PyExc_RuntimeError, "this compiler does not handle FunctionTypes"); -- cgit v0.12