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
This commit is contained in:
parent
637a09b0d6
commit
02a1603f91
|
@ -618,16 +618,6 @@ class Obj2ModVisitor(PickleVisitor):
|
||||||
self.emit("}", depth)
|
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):
|
class SequenceConstructorVisitor(EmitVisitor):
|
||||||
def visitModule(self, mod):
|
def visitModule(self, mod):
|
||||||
for dfn in mod.dfns:
|
for dfn in mod.dfns:
|
||||||
|
@ -1167,25 +1157,6 @@ PyInit__ast(void)
|
||||||
self.emit("Py_INCREF(state->%s_type);" % name, 1)
|
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):
|
class StaticVisitor(PickleVisitor):
|
||||||
CODE = '''Very simple, always emit this static code. Override CODE'''
|
CODE = '''Very simple, always emit this static code. Override CODE'''
|
||||||
|
|
||||||
|
@ -1283,18 +1254,6 @@ class ObjVisitor(PickleVisitor):
|
||||||
emit("goto failed;", 1)
|
emit("goto failed;", 1)
|
||||||
emit("Py_DECREF(value);", 0)
|
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):
|
def set(self, field, value, depth):
|
||||||
if field.seq:
|
if field.seq:
|
||||||
# XXX should really check for is_simple, but that requires a symbol table
|
# XXX should really check for is_simple, but that requires a symbol table
|
||||||
|
@ -1313,7 +1272,6 @@ class ObjVisitor(PickleVisitor):
|
||||||
else:
|
else:
|
||||||
self.emit("value = ast2obj_list(state, (asdl_seq*)%s, ast2obj_%s);" % (value, field.type), depth)
|
self.emit("value = ast2obj_list(state, (asdl_seq*)%s, ast2obj_%s);" % (value, field.type), depth)
|
||||||
else:
|
else:
|
||||||
ctype = get_c_type(field.type)
|
|
||||||
self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False)
|
self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1897,7 +1897,7 @@ _PyPegen_empty_arguments(Parser *p)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, kwdefaults,
|
return _Py_arguments(posonlyargs, posargs, NULL, kwonlyargs, kwdefaults, NULL, posdefaults,
|
||||||
p->arena);
|
p->arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
14
Python/ast.c
14
Python/ast.c
|
@ -1,18 +1,12 @@
|
||||||
/*
|
/*
|
||||||
* This file includes functions to transform a concrete syntax tree (CST) to
|
* This file exposes PyAST_Validate interface to check the integrity
|
||||||
* an abstract syntax tree (AST). The main function is PyAST_FromNode().
|
* of the given abstract syntax tree (potentially constructed manually).
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "Python-ast.h"
|
#include "Python-ast.h"
|
||||||
#include "ast.h"
|
#include "ast.h"
|
||||||
#include "token.h"
|
|
||||||
#include "pythonrun.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define MAXLEVEL 200 /* Max parentheses level */
|
|
||||||
|
|
||||||
static int validate_stmts(asdl_stmt_seq *);
|
static int validate_stmts(asdl_stmt_seq *);
|
||||||
static int validate_exprs(asdl_expr_seq*, expr_context_ty, int);
|
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;
|
Py_ssize_t i;
|
||||||
for (i = 0; i < asdl_seq_LEN(keywords); 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 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -556,7 +550,7 @@ _PyAST_GetDocString(asdl_stmt_seq *body)
|
||||||
if (!asdl_seq_LEN(body)) {
|
if (!asdl_seq_LEN(body)) {
|
||||||
return NULL;
|
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) {
|
if (st->kind != Expr_kind) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue