mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00
Make AST nodes pickleable.
This commit is contained in:
parent
1721e75749
commit
e34c21c2a0
3 changed files with 68 additions and 4 deletions
|
@ -166,6 +166,20 @@ class AST_Tests(unittest.TestCase):
|
||||||
# this used to fail because Sub._fields was None
|
# this used to fail because Sub._fields was None
|
||||||
x = _ast.Sub()
|
x = _ast.Sub()
|
||||||
|
|
||||||
|
def test_pickling(self):
|
||||||
|
import pickle
|
||||||
|
mods = [pickle]
|
||||||
|
try:
|
||||||
|
import cPickle
|
||||||
|
mods.append(cPickle)
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
protocols = [0, 1, 2]
|
||||||
|
for mod in mods:
|
||||||
|
for protocol in protocols:
|
||||||
|
for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
|
||||||
|
ast2 = mod.loads(mod.dumps(ast, protocol))
|
||||||
|
self.assertEquals(to_tuple(ast2), to_tuple(ast))
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
test_support.run_unittest(AST_Tests)
|
test_support.run_unittest(AST_Tests)
|
||||||
|
|
|
@ -629,9 +629,34 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Pickling support */
|
||||||
|
static PyObject *
|
||||||
|
ast_type_reduce(PyObject *self, PyObject *unused)
|
||||||
|
{
|
||||||
|
PyObject *res;
|
||||||
|
PyObject *dict = PyObject_GetAttrString(self, "__dict__");
|
||||||
|
if (dict == NULL) {
|
||||||
|
if (PyErr_ExceptionMatches(PyExc_AttributeError))
|
||||||
|
PyErr_Clear();
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (dict) {
|
||||||
|
res = Py_BuildValue("O()O", Py_TYPE(self), dict);
|
||||||
|
Py_DECREF(dict);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return Py_BuildValue("O()", Py_TYPE(self));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyMethodDef ast_type_methods[] = {
|
||||||
|
{"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
static PyTypeObject AST_type = {
|
static PyTypeObject AST_type = {
|
||||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||||
"AST",
|
"_ast.AST",
|
||||||
sizeof(PyObject),
|
sizeof(PyObject),
|
||||||
0,
|
0,
|
||||||
0, /* tp_dealloc */
|
0, /* tp_dealloc */
|
||||||
|
@ -657,7 +682,7 @@ static PyTypeObject AST_type = {
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
0, /* tp_iter */
|
0, /* tp_iter */
|
||||||
0, /* tp_iternext */
|
0, /* tp_iternext */
|
||||||
0, /* tp_methods */
|
ast_type_methods, /* tp_methods */
|
||||||
0, /* tp_members */
|
0, /* tp_members */
|
||||||
0, /* tp_getset */
|
0, /* tp_getset */
|
||||||
0, /* tp_base */
|
0, /* tp_base */
|
||||||
|
|
|
@ -420,9 +420,34 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Pickling support */
|
||||||
|
static PyObject *
|
||||||
|
ast_type_reduce(PyObject *self, PyObject *unused)
|
||||||
|
{
|
||||||
|
PyObject *res;
|
||||||
|
PyObject *dict = PyObject_GetAttrString(self, "__dict__");
|
||||||
|
if (dict == NULL) {
|
||||||
|
if (PyErr_ExceptionMatches(PyExc_AttributeError))
|
||||||
|
PyErr_Clear();
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (dict) {
|
||||||
|
res = Py_BuildValue("O()O", Py_TYPE(self), dict);
|
||||||
|
Py_DECREF(dict);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
return Py_BuildValue("O()", Py_TYPE(self));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyMethodDef ast_type_methods[] = {
|
||||||
|
{"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
static PyTypeObject AST_type = {
|
static PyTypeObject AST_type = {
|
||||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||||
"AST",
|
"_ast.AST",
|
||||||
sizeof(PyObject),
|
sizeof(PyObject),
|
||||||
0,
|
0,
|
||||||
0, /* tp_dealloc */
|
0, /* tp_dealloc */
|
||||||
|
@ -448,7 +473,7 @@ static PyTypeObject AST_type = {
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
0, /* tp_iter */
|
0, /* tp_iter */
|
||||||
0, /* tp_iternext */
|
0, /* tp_iternext */
|
||||||
0, /* tp_methods */
|
ast_type_methods, /* tp_methods */
|
||||||
0, /* tp_members */
|
0, /* tp_members */
|
||||||
0, /* tp_getset */
|
0, /* tp_getset */
|
||||||
0, /* tp_base */
|
0, /* tp_base */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue