Mercurial > cpython-lru_cache-weakref
diff Python/bltinmodule.c @ 46162:ca38f7a4b4c9 legacy-trunk
Patch #1810 by Thomas Lee, reviewed by myself:
allow compiling Python AST objects into code objects
in compile().
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Fri, 28 Mar 2008 12:11:56 +0000 |
| parents | 5341b30b1812 |
| children | b0bf06d49647 |
line wrap: on
line diff
--- a/Python/bltinmodule.c Fri Mar 28 08:32:09 2008 +0000 +++ b/Python/bltinmodule.c Fri Mar 28 12:11:56 2008 +0000 @@ -1,6 +1,7 @@ /* Built-in functions */ #include "Python.h" +#include "Python-ast.h" #include "node.h" #include "code.h" @@ -481,6 +482,41 @@ cf.cf_flags = supplied_flags; + if (supplied_flags & + ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST)) + { + PyErr_SetString(PyExc_ValueError, + "compile(): unrecognised flags"); + return NULL; + } + /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */ + + if (!dont_inherit) { + PyEval_MergeCompilerFlags(&cf); + } + + if (PyAST_Check(cmd)) { + 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; + } + #ifdef Py_USING_UNICODE if (PyUnicode_Check(cmd)) { tmp = PyUnicode_AsUTF8String(cmd); @@ -490,14 +526,7 @@ cf.cf_flags |= PyCF_SOURCE_IS_UTF8; } #endif - if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length)) - return NULL; - if ((size_t)length != strlen(str)) { - PyErr_SetString(PyExc_TypeError, - "compile() expected string without null bytes"); - goto cleanup; - } - + /* 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) @@ -506,21 +535,17 @@ start = Py_single_input; else { PyErr_SetString(PyExc_ValueError, - "compile() arg 3 must be 'exec' or 'eval' or 'single'"); + "compile() arg 3 must be 'exec'" + "or 'eval' or 'single'"); goto cleanup; } - if (supplied_flags & - ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST)) - { - PyErr_SetString(PyExc_ValueError, - "compile(): unrecognised flags"); + if (PyObject_AsReadBuffer(cmd, (const void **)&str, &length)) goto cleanup; - } - /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */ - - if (!dont_inherit) { - PyEval_MergeCompilerFlags(&cf); + if ((size_t)length != strlen(str)) { + PyErr_SetString(PyExc_TypeError, + "compile() expected string without null bytes"); + goto cleanup; } result = Py_CompileStringFlags(str, filename, start, &cf); cleanup:
