]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39639: Remove the AST "Suite" node and associated code (GH-18513)
authorBatuhan Taşkaya <47358913+isidentical@users.noreply.github.com>
Wed, 4 Mar 2020 16:16:47 +0000 (19:16 +0300)
committerGitHub <noreply@github.com>
Wed, 4 Mar 2020 16:16:46 +0000 (16:16 +0000)
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>
Doc/whatsnew/3.9.rst
Include/Python-ast.h
Lib/test/test_asdl_parser.py
Misc/NEWS.d/next/Core and Builtins/2020-02-15-15-29-34.bpo-39639.3mqJjm.rst [new file with mode: 0644]
Parser/Python.asdl
Python/Python-ast.c
Python/ast.c
Python/ast_opt.c
Python/compile.c
Python/symtable.c

index f15805c794ea85db6b78c631880355bfc59d413d..d072b8db311cfe7bf3be154be6bbe4e038fcc916 100644 (file)
@@ -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
 =====================
index b9232b1d4630743a7582fb8d664ebc19b62bcd01..931a6b945b47296f1c5ee05ac53a078cbd1742be 100644 (file)
@@ -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
index 9eaceecd50dbc0a7bd995215d137aca78b9ecad0..d3306c22184c5b0ca4da7f41992d027d4c1b1562 100644 (file)
@@ -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 (file)
index 0000000..7a54dd0
--- /dev/null
@@ -0,0 +1 @@
+Remove ``ast.Suite`` node class because it's no longer used. Patch by Batuhan Taskaya.
index 126d478975bbbb449e600fcecff5072a7239bd94..bec30a7a1f3116ef5d629f65db36b5e0f9928c8e 100644 (file)
@@ -3,14 +3,11 @@
 
 module Python
 {
-    mod = Module(stmt* body, type_ignore *type_ignores)
+    mod = Module(stmt* body, type_ignoretype_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)
 
index e9925e742e733a26344f5d3d3a96672e31037493..2784c427d72dc807a76616aef383231dc2f7378b 100644 (file)
@@ -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;
     }
index 0aed54c8fe2ea8b1b9632785904e20a6932954b3..43b50c5dd4cc2be083afd31ae348cd716d8e063a 100644 (file)
@@ -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;
index f2a2c259149932e8a4c0377c4bb5d8a7a70f51f1..39e164adb8c9495814d45cc0fd78dd3df6ac5059 100644 (file)
@@ -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;
     }
index bf8c8109d0758381750a9ffd698f89a63375dbcb..f603e3d29e539d17ebdfab7815186fa8df7d3cf8 100644 (file)
@@ -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",
index 30482d99b3ca927c2034c0e3e84fb202179b2756..a98a0fa6092cc6d36cfd3cd2e72c0c60f4daf3c5 100644 (file)
@@ -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");