]> granicus.if.org Git - python/commitdiff
give the AST class a __dict__
authorBenjamin Peterson <benjamin@python.org>
Mon, 12 Mar 2012 16:46:44 +0000 (09:46 -0700)
committerBenjamin Peterson <benjamin@python.org>
Mon, 12 Mar 2012 16:46:44 +0000 (09:46 -0700)
Lib/test/test_ast.py
Misc/NEWS
Parser/asdl_c.py
Python/Python-ast.c

index bac52be23d5a70314bcf3ef94ce3f80f797a8b4d..064c669d7fe4e76e50a7e10b6a871f45b4eddd11 100644 (file)
@@ -196,6 +196,9 @@ class AST_Tests(unittest.TestCase):
     def test_AST_objects(self):
         x = ast.AST()
         self.assertEqual(x._fields, ())
+        x.foobar = 42
+        self.assertEqual(x.foobar, 42)
+        self.assertEqual(x.__dict__["foobar"], 42)
 
         with self.assertRaises(AttributeError):
             x.vararg
index 7055bd3e29e0bdf2913baee11ef5300902ab0ef6..cd522dc6e5ff0eff5467bd6c275d1d6a24d40b0d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ What's New in Python 3.3.0 Alpha 2?
 Core and Builtins
 -----------------
 
+- Give the ast.AST class a __dict__.
+
 - Issue #1469629: Allow cycles through an object's __dict__ slot to be
   collected. (For example if ``x.__dict__ is x``).
 
index 07c06dea725ff222be9e1a6dad247260b6c9292a..2f269f47140f2138a08717cb02dd4f904c4fdf6b 100755 (executable)
@@ -603,6 +603,11 @@ class PyTypesVisitor(PickleVisitor):
 
     def visitModule(self, mod):
         self.emit("""
+typedef struct {
+    PyObject_HEAD;
+    PyObject *dict;
+} AST_object;
+
 static int
 ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
 {
@@ -681,10 +686,15 @@ static PyMethodDef ast_type_methods[] = {
     {NULL}
 };
 
+static PyGetSetDef ast_type_getsets[] = {
+    {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
+    {NULL}
+};
+
 static PyTypeObject AST_type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "_ast.AST",
-    sizeof(PyObject),
+    sizeof(AST_object),
     0,
     0,                       /* tp_dealloc */
     0,                       /* tp_print */
@@ -711,12 +721,12 @@ static PyTypeObject AST_type = {
     0,                       /* tp_iternext */
     ast_type_methods,        /* tp_methods */
     0,                       /* tp_members */
-    0,                       /* tp_getset */
+    ast_type_getsets,        /* tp_getset */
     0,                       /* tp_base */
     0,                       /* tp_dict */
     0,                       /* tp_descr_get */
     0,                       /* tp_descr_set */
-    0,                       /* tp_dictoffset */
+    offsetof(AST_object, dict),/* tp_dictoffset */
     (initproc)ast_type_init, /* tp_init */
     PyType_GenericAlloc,     /* tp_alloc */
     PyType_GenericNew,       /* tp_new */
@@ -1185,6 +1195,8 @@ def main(srcfile):
         p = os.path.join(SRC_DIR, str(mod.name) + "-ast.c")
         f = open(p, "w")
         f.write(auto_gen_msg)
+        f.write('#include <stddef.h>\n')
+        f.write('\n')
         f.write('#include "Python.h"\n')
         f.write('#include "%s-ast.h"\n' % mod.name)
         f.write('\n')
index 2603b812f08688336f4ebe950ada0bc8c25e7610..cf73beaa15889d23d8ee4f45a068a30abd5dc4f8 100644 (file)
@@ -1,5 +1,7 @@
 /* File automatically generated by Parser/asdl_c.py. */
 
+#include <stddef.h>
+
 #include "Python.h"
 #include "Python-ast.h"
 
@@ -453,6 +455,11 @@ static char *withitem_fields[]={
 };
 
 
+typedef struct {
+    PyObject_HEAD;
+    PyObject *dict;
+} AST_object;
+
 static int
 ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
 {
@@ -531,10 +538,15 @@ static PyMethodDef ast_type_methods[] = {
     {NULL}
 };
 
+static PyGetSetDef ast_type_getsets[] = {
+    {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
+    {NULL}
+};
+
 static PyTypeObject AST_type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "_ast.AST",
-    sizeof(PyObject),
+    sizeof(AST_object),
     0,
     0,                       /* tp_dealloc */
     0,                       /* tp_print */
@@ -561,12 +573,12 @@ static PyTypeObject AST_type = {
     0,                       /* tp_iternext */
     ast_type_methods,        /* tp_methods */
     0,                       /* tp_members */
-    0,                       /* tp_getset */
+    ast_type_getsets,        /* tp_getset */
     0,                       /* tp_base */
     0,                       /* tp_dict */
     0,                       /* tp_descr_get */
     0,                       /* tp_descr_set */
-    0,                       /* tp_dictoffset */
+    offsetof(AST_object, dict),/* tp_dictoffset */
     (initproc)ast_type_init, /* tp_init */
     PyType_GenericAlloc,     /* tp_alloc */
     PyType_GenericNew,       /* tp_new */