]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fixed #4067 by implementing _attributes and _fields for the AST root node.
authorArmin Ronacher <armin.ronacher@active-4.com>
Sun, 19 Oct 2008 08:27:43 +0000 (08:27 +0000)
committerArmin Ronacher <armin.ronacher@active-4.com>
Sun, 19 Oct 2008 08:27:43 +0000 (08:27 +0000)
Parser/asdl_c.py
Python/Python-ast.c

index 46135009221fe3c79b34d6d84668c478512da767..46688a3084f59e5427cb0747c9daaccee68e233d 100755 (executable)
@@ -824,12 +824,30 @@ static int obj2ast_bool(PyObject* obj, bool* out, PyArena* arena)
     return 0;
 }
 
+static int add_ast_fields()
+{
+    PyObject *empty_tuple, *d;
+    if (PyType_Ready(&AST_type) < 0)
+        return -1;
+    d = AST_type.tp_dict;
+    empty_tuple = PyTuple_New(0);
+    if (!empty_tuple ||
+        PyDict_SetItemString(d, "_fields", empty_tuple) < 0 ||
+        PyDict_SetItemString(d, "_attributes", empty_tuple) < 0) {
+        Py_XDECREF(empty_tuple);
+        return -1;
+    }
+    Py_DECREF(empty_tuple);
+    return 0;
+}
+
 """, 0, reflow=False)
 
         self.emit("static int init_types(void)",0)
         self.emit("{", 0)
         self.emit("static int initialized;", 1)
         self.emit("if (initialized) return 1;", 1)
+        self.emit("if (add_ast_fields() < 0) return 0;", 1)
         for dfn in mod.dfns:
             self.visit(dfn)
         self.emit("initialized = 1;", 1)
index 1c78515bceac9e2f1284b3d2fdf40a3dfb8b6939..cabc66639b60eab8b2d796f9a7942ab464ebcc14 100644 (file)
@@ -615,11 +615,29 @@ static int obj2ast_bool(PyObject* obj, bool* out, PyArena* arena)
     return 0;
 }
 
+static int add_ast_fields()
+{
+    PyObject *empty_tuple, *d;
+    if (PyType_Ready(&AST_type) < 0)
+        return -1;
+    d = AST_type.tp_dict;
+    empty_tuple = PyTuple_New(0);
+    if (!empty_tuple ||
+        PyDict_SetItemString(d, "_fields", empty_tuple) < 0 ||
+        PyDict_SetItemString(d, "_attributes", empty_tuple) < 0) {
+        Py_XDECREF(empty_tuple);
+        return -1;
+    }
+    Py_DECREF(empty_tuple);
+    return 0;
+}
+
 
 static int init_types(void)
 {
         static int initialized;
         if (initialized) return 1;
+        if (add_ast_fields() < 0) return 0;
         mod_type = make_type("mod", &AST_type, NULL, 0);
         if (!mod_type) return 0;
         if (!add_attributes(mod_type, NULL, 0)) return 0;