Merged revisions 62004 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62004 | georg.brandl | 2008-03-28 13:11:56 +0100 (Fr, 28 Mär 2008) | 4 lines
Patch #1810 by Thomas Lee, reviewed by myself:
allow compiling Python AST objects into code objects
in compile().
........
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index b3d8b16..ccfce06 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1,6 +1,7 @@
/* Built-in functions */
#include "Python.h"
+#include "Python-ast.h"
#include "node.h"
#include "code.h"
@@ -527,22 +528,6 @@
cf.cf_flags = supplied_flags | PyCF_SOURCE_IS_UTF8;
- str = source_as_string(cmd);
- if (str == NULL)
- return NULL;
-
- if (strcmp(startstr, "exec") == 0)
- start = Py_file_input;
- else if (strcmp(startstr, "eval") == 0)
- start = Py_eval_input;
- else if (strcmp(startstr, "single") == 0)
- start = Py_single_input;
- else {
- PyErr_SetString(PyExc_ValueError,
- "compile() arg 3 must be 'exec' or 'eval' or 'single'");
- return NULL;
- }
-
if (supplied_flags &
~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST))
{
@@ -555,6 +540,48 @@
if (!dont_inherit) {
PyEval_MergeCompilerFlags(&cf);
}
+
+ if (PyAST_Check(cmd)) {
+ PyObject *result;
+ if (supplied_flags & PyCF_ONLY_AST) {
+ Py_INCREF(cmd);
+ result = cmd;
+ }
+ else {
+ PyArena *arena;
+ mod_ty mod;
+
+ arena = PyArena_New();
+ mod = PyAST_obj2mod(cmd, arena);
+ if (mod == NULL) {
+ PyArena_Free(arena);
+ return NULL;
+ }
+ result = (PyObject*)PyAST_Compile(mod, filename,
+ &cf, arena);
+ PyArena_Free(arena);
+ }
+ return result;
+ }
+
+ /* XXX: is it possible to pass start to the PyAST_ branch? */
+ if (strcmp(startstr, "exec") == 0)
+ start = Py_file_input;
+ else if (strcmp(startstr, "eval") == 0)
+ start = Py_eval_input;
+ else if (strcmp(startstr, "single") == 0)
+ start = Py_single_input;
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "compile() arg 3 must be 'exec'"
+ "or 'eval' or 'single'");
+ return NULL;
+ }
+
+ str = source_as_string(cmd);
+ if (str == NULL)
+ return NULL;
+
return Py_CompileStringFlags(str, filename, start, &cf);
}