From 02a1603f918b9862e164e4fd050c505b16bc9f57 Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Sat, 10 Oct 2020 20:14:59 +0300 Subject: [PATCH] bpo-42000: Cleanup the AST related C-code (GH-22641) - Use the proper asdl sequence when creating empty arguments - Remove reduntant casts (thanks to new typed asdl_sequences) - Remove MarshalPrototypeVisitor and some utilities from asdl generator - Fix the header of `Python/ast.c` (kept from pgen times) Automerge-Triggered-By: @pablogsal --- Parser/asdl_c.py | 42 ------------------------------------------ Parser/pegen.c | 2 +- Python/ast.c | 14 ++++---------- 3 files changed, 5 insertions(+), 53 deletions(-) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 242eccf3d37..481261cd853 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -618,16 +618,6 @@ class Obj2ModVisitor(PickleVisitor): self.emit("}", depth) -class MarshalPrototypeVisitor(PickleVisitor): - - def prototype(self, sum, name): - ctype = get_c_type(name) - self.emit("static int marshal_write_%s(PyObject **, int *, %s);" - % (name, ctype), 0) - - visitProduct = visitSum = prototype - - class SequenceConstructorVisitor(EmitVisitor): def visitModule(self, mod): for dfn in mod.dfns: @@ -1167,25 +1157,6 @@ PyInit__ast(void) self.emit("Py_INCREF(state->%s_type);" % name, 1) -_SPECIALIZED_SEQUENCES = ('stmt', 'expr') - -def find_sequence(fields, doing_specialization): - """Return True if any field uses a sequence.""" - for f in fields: - if f.seq: - if not doing_specialization: - return True - if str(f.type) not in _SPECIALIZED_SEQUENCES: - return True - return False - -def has_sequence(types, doing_specialization): - for t in types: - if find_sequence(t.fields, doing_specialization): - return True - return False - - class StaticVisitor(PickleVisitor): CODE = '''Very simple, always emit this static code. Override CODE''' @@ -1283,18 +1254,6 @@ class ObjVisitor(PickleVisitor): emit("goto failed;", 1) emit("Py_DECREF(value);", 0) - def emitSeq(self, field, value, depth, emit): - emit("seq = %s;" % value, 0) - emit("n = asdl_seq_LEN(seq);", 0) - emit("value = PyList_New(n);", 0) - emit("if (!value) goto failed;", 0) - emit("for (i = 0; i < n; i++) {", 0) - self.set("value", field, "asdl_seq_GET(seq, i)", depth + 1) - emit("if (!value1) goto failed;", 1) - emit("PyList_SET_ITEM(value, i, value1);", 1) - emit("value1 = NULL;", 1) - emit("}", 0) - def set(self, field, value, depth): if field.seq: # XXX should really check for is_simple, but that requires a symbol table @@ -1313,7 +1272,6 @@ class ObjVisitor(PickleVisitor): else: self.emit("value = ast2obj_list(state, (asdl_seq*)%s, ast2obj_%s);" % (value, field.type), depth) else: - ctype = get_c_type(field.type) self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False) diff --git a/Parser/pegen.c b/Parser/pegen.c index 1de495eaf39..efa5ed9f288 100644 --- a/Parser/pegen.c +++ b/Parser/pegen.c @@ -1897,7 +1897,7 @@ _PyPegen_empty_arguments(Parser *p) return NULL; } - return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, kwdefaults, + return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, posdefaults, p->arena); } diff --git a/Python/ast.c b/Python/ast.c index 4b7bbd229c9..5e74f65a2c0 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1,18 +1,12 @@ /* - * This file includes functions to transform a concrete syntax tree (CST) to - * an abstract syntax tree (AST). The main function is PyAST_FromNode(). - * + * This file exposes PyAST_Validate interface to check the integrity + * of the given abstract syntax tree (potentially constructed manually). */ #include "Python.h" #include "Python-ast.h" #include "ast.h" -#include "token.h" -#include "pythonrun.h" #include -#include - -#define MAXLEVEL 200 /* Max parentheses level */ static int validate_stmts(asdl_stmt_seq *); static int validate_exprs(asdl_expr_seq*, expr_context_ty, int); @@ -62,7 +56,7 @@ validate_keywords(asdl_keyword_seq *keywords) { Py_ssize_t i; for (i = 0; i < asdl_seq_LEN(keywords); i++) - if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load)) + if (!validate_expr((asdl_seq_GET(keywords, i))->value, Load)) return 0; return 1; } @@ -556,7 +550,7 @@ _PyAST_GetDocString(asdl_stmt_seq *body) if (!asdl_seq_LEN(body)) { return NULL; } - stmt_ty st = (stmt_ty)asdl_seq_GET(body, 0); + stmt_ty st = asdl_seq_GET(body, 0); if (st->kind != Expr_kind) { return NULL; }