give the AST class a __dict__

This commit is contained in:
Benjamin Peterson 2012-03-12 09:46:44 -07:00
parent 61a4161de4
commit 7e0dbfbbde
4 changed files with 35 additions and 6 deletions

View File

@ -196,6 +196,9 @@ class AST_Tests(unittest.TestCase):
def test_AST_objects(self): def test_AST_objects(self):
x = ast.AST() x = ast.AST()
self.assertEqual(x._fields, ()) self.assertEqual(x._fields, ())
x.foobar = 42
self.assertEqual(x.foobar, 42)
self.assertEqual(x.__dict__["foobar"], 42)
with self.assertRaises(AttributeError): with self.assertRaises(AttributeError):
x.vararg x.vararg

View File

@ -10,6 +10,8 @@ What's New in Python 3.3.0 Alpha 2?
Core and Builtins Core and Builtins
----------------- -----------------
- Give the ast.AST class a __dict__.
- Issue #1469629: Allow cycles through an object's __dict__ slot to be - Issue #1469629: Allow cycles through an object's __dict__ slot to be
collected. (For example if ``x.__dict__ is x``). collected. (For example if ``x.__dict__ is x``).

View File

@ -603,6 +603,11 @@ class PyTypesVisitor(PickleVisitor):
def visitModule(self, mod): def visitModule(self, mod):
self.emit(""" self.emit("""
typedef struct {
PyObject_HEAD;
PyObject *dict;
} AST_object;
static int static int
ast_type_init(PyObject *self, PyObject *args, PyObject *kw) ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
{ {
@ -681,10 +686,15 @@ static PyMethodDef ast_type_methods[] = {
{NULL} {NULL}
}; };
static PyGetSetDef ast_type_getsets[] = {
{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
{NULL}
};
static PyTypeObject AST_type = { static PyTypeObject AST_type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT(&PyType_Type, 0)
"_ast.AST", "_ast.AST",
sizeof(PyObject), sizeof(AST_object),
0, 0,
0, /* tp_dealloc */ 0, /* tp_dealloc */
0, /* tp_print */ 0, /* tp_print */
@ -711,12 +721,12 @@ static PyTypeObject AST_type = {
0, /* tp_iternext */ 0, /* tp_iternext */
ast_type_methods, /* tp_methods */ ast_type_methods, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ ast_type_getsets, /* tp_getset */
0, /* tp_base */ 0, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
0, /* tp_descr_get */ 0, /* tp_descr_get */
0, /* tp_descr_set */ 0, /* tp_descr_set */
0, /* tp_dictoffset */ offsetof(AST_object, dict),/* tp_dictoffset */
(initproc)ast_type_init, /* tp_init */ (initproc)ast_type_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */ PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */ PyType_GenericNew, /* tp_new */
@ -1185,6 +1195,8 @@ def main(srcfile):
p = os.path.join(SRC_DIR, str(mod.name) + "-ast.c") p = os.path.join(SRC_DIR, str(mod.name) + "-ast.c")
f = open(p, "w") f = open(p, "w")
f.write(auto_gen_msg) f.write(auto_gen_msg)
f.write('#include <stddef.h>\n')
f.write('\n')
f.write('#include "Python.h"\n') f.write('#include "Python.h"\n')
f.write('#include "%s-ast.h"\n' % mod.name) f.write('#include "%s-ast.h"\n' % mod.name)
f.write('\n') f.write('\n')

View File

@ -1,5 +1,7 @@
/* File automatically generated by Parser/asdl_c.py. */ /* File automatically generated by Parser/asdl_c.py. */
#include <stddef.h>
#include "Python.h" #include "Python.h"
#include "Python-ast.h" #include "Python-ast.h"
@ -453,6 +455,11 @@ static char *withitem_fields[]={
}; };
typedef struct {
PyObject_HEAD;
PyObject *dict;
} AST_object;
static int static int
ast_type_init(PyObject *self, PyObject *args, PyObject *kw) ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
{ {
@ -531,10 +538,15 @@ static PyMethodDef ast_type_methods[] = {
{NULL} {NULL}
}; };
static PyGetSetDef ast_type_getsets[] = {
{"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict},
{NULL}
};
static PyTypeObject AST_type = { static PyTypeObject AST_type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT(&PyType_Type, 0)
"_ast.AST", "_ast.AST",
sizeof(PyObject), sizeof(AST_object),
0, 0,
0, /* tp_dealloc */ 0, /* tp_dealloc */
0, /* tp_print */ 0, /* tp_print */
@ -561,12 +573,12 @@ static PyTypeObject AST_type = {
0, /* tp_iternext */ 0, /* tp_iternext */
ast_type_methods, /* tp_methods */ ast_type_methods, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ ast_type_getsets, /* tp_getset */
0, /* tp_base */ 0, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
0, /* tp_descr_get */ 0, /* tp_descr_get */
0, /* tp_descr_set */ 0, /* tp_descr_set */
0, /* tp_dictoffset */ offsetof(AST_object, dict),/* tp_dictoffset */
(initproc)ast_type_init, /* tp_init */ (initproc)ast_type_init, /* tp_init */
PyType_GenericAlloc, /* tp_alloc */ PyType_GenericAlloc, /* tp_alloc */
PyType_GenericNew, /* tp_new */ PyType_GenericNew, /* tp_new */