diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2020-03-09 22:07:47 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-09 22:07:47 (GMT) |
commit | b7e9525f9c7ef02a1d2ad8253afdeb733b0951d4 (patch) | |
tree | a5a765156210e426d89e5f19a75f932dd2165834 /Parser | |
parent | 85f5a69ae1541271286bb0f0e0303aabf792dd5c (diff) | |
download | cpython-b7e9525f9c7ef02a1d2ad8253afdeb733b0951d4.zip cpython-b7e9525f9c7ef02a1d2ad8253afdeb733b0951d4.tar.gz cpython-b7e9525f9c7ef02a1d2ad8253afdeb733b0951d4.tar.bz2 |
bpo-36287: Make ast.dump() not output optional fields and attributes with default values. (GH-18843)
The default values for optional fields and attributes of AST nodes are now set
as class attributes (e.g. Constant.kind is set to None).
Diffstat (limited to 'Parser')
-rwxr-xr-x | Parser/asdl_c.py | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index e81506c..016c12d 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -957,6 +957,8 @@ static int add_ast_fields(void) (name, name, len(prod.attributes)), 1) else: self.emit("if (!add_attributes(state->%s_type, NULL, 0)) return 0;" % name, 1) + self.emit_defaults(name, prod.fields, 1) + self.emit_defaults(name, prod.attributes, 1) def visitSum(self, sum, name): self.emit('state->%s_type = make_type("%s", state->AST_type, NULL, 0);' % @@ -968,6 +970,7 @@ static int add_ast_fields(void) (name, name, len(sum.attributes)), 1) else: self.emit("if (!add_attributes(state->%s_type, NULL, 0)) return 0;" % name, 1) + self.emit_defaults(name, sum.attributes, 1) simple = is_simple(sum) for t in sum.types: self.visitConstructor(t, name, simple) @@ -981,12 +984,20 @@ static int add_ast_fields(void) (cons.name, cons.name, name, fields, len(cons.fields)), 1) self.emit("if (!state->%s_type) return 0;" % cons.name, 1) self.emit_type("%s_type" % cons.name) + self.emit_defaults(cons.name, cons.fields, 1) if simple: self.emit("state->%s_singleton = PyType_GenericNew((PyTypeObject *)" "state->%s_type, NULL, NULL);" % (cons.name, cons.name), 1) self.emit("if (!state->%s_singleton) return 0;" % cons.name, 1) + def emit_defaults(self, name, fields, depth): + for field in fields: + if field.opt: + self.emit('if (PyObject_SetAttr(state->%s_type, state->%s, Py_None) == -1)' % + (name, field.name), depth) + self.emit("return 0;", depth+1) + class ASTModuleVisitor(PickleVisitor): |