Mercurial > cpython-lru_cache-weakref
diff Python/bltinmodule.c @ 46208:ea75b12fe8e7
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().
........
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Sun, 30 Mar 2008 20:03:44 +0000 |
| parents | 740b5808c57a |
| children | b2d93a960b98 |
line wrap: on
line diff
--- a/Python/bltinmodule.c Sat Mar 29 19:13:55 2008 +0000 +++ b/Python/bltinmodule.c Sun Mar 30 20:03:44 2008 +0000 @@ -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); }
