diff -r 2c8b81c87520 -r 8dcb1e2a04a0 Include/pythonrun.h --- a/Include/pythonrun.h Fri Jan 22 17:43:39 2016 +0100 +++ b/Include/pythonrun.h Fri Jan 22 23:19:28 2016 +0100 @@ -16,6 +16,7 @@ extern "C" { #define PyCF_DONT_IMPLY_DEDENT 0x0200 #define PyCF_ONLY_AST 0x0400 #define PyCF_IGNORE_COOKIE 0x0800 +#define PyCF_TRANSFORMED_AST 0x1000 #ifndef Py_LIMITED_API typedef struct { diff -r 2c8b81c87520 -r 8dcb1e2a04a0 Lib/test/test_pep511.py --- a/Lib/test/test_pep511.py Fri Jan 22 17:43:39 2016 +0100 +++ b/Lib/test/test_pep511.py Fri Jan 22 23:19:28 2016 +0100 @@ -69,7 +69,8 @@ class CodeTransformerTests(unittest.Test expected = ast.parse('print("Ni! Ni! Ni!")') sys.set_code_transformers([ASTTransformer()]) - tree = ast.parse('print("Hello World")') + tree = compile('print("Hello World")', 'string', 'exec', + flags=ast.PyCF_TRANSFORMED_AST) self.assertEqual(ast.dump(tree), ast.dump(expected)) def test_ast_call(self): diff -r 2c8b81c87520 -r 8dcb1e2a04a0 Parser/asdl_c.py --- a/Parser/asdl_c.py Fri Jan 22 17:43:39 2016 +0100 +++ b/Parser/asdl_c.py Fri Jan 22 23:19:28 2016 +0100 @@ -1035,6 +1035,8 @@ class ASTModuleVisitor(PickleVisitor): self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;', 1) self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)', 1) self.emit("return NULL;", 2) + self.emit('if (PyModule_AddIntMacro(m, PyCF_TRANSFORMED_AST) < 0)', 1) + self.emit("return NULL;", 2) for dfn in mod.dfns: self.visit(dfn) self.emit("return m;", 1) diff -r 2c8b81c87520 -r 8dcb1e2a04a0 Python/Python-ast.c --- a/Python/Python-ast.c Fri Jan 22 17:43:39 2016 +0100 +++ b/Python/Python-ast.c Fri Jan 22 23:19:28 2016 +0100 @@ -7500,6 +7500,8 @@ PyInit__ast(void) if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL; if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) return NULL; + if (PyModule_AddIntMacro(m, PyCF_TRANSFORMED_AST) < 0) + return NULL; if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL; if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return NULL; diff -r 2c8b81c87520 -r 8dcb1e2a04a0 Python/bltinmodule.c --- a/Python/bltinmodule.c Fri Jan 22 17:43:39 2016 +0100 +++ b/Python/bltinmodule.c Fri Jan 22 23:19:28 2016 +0100 @@ -688,7 +688,8 @@ builtin_compile_impl(PyModuleDef *module cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8; if (flags & - ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST)) + ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT + | PyCF_ONLY_AST | PyCF_TRANSFORMED_AST)) { PyErr_SetString(PyExc_ValueError, "compile(): unrecognised flags"); @@ -722,7 +723,7 @@ builtin_compile_impl(PyModuleDef *module if (is_ast == -1) goto error; if (is_ast) { - if (flags & PyCF_ONLY_AST) { + if (flags & (PyCF_ONLY_AST | PyCF_TRANSFORMED_AST)) { Py_INCREF(source); result = source; } diff -r 2c8b81c87520 -r 8dcb1e2a04a0 Python/pythonrun.c --- a/Python/pythonrun.c Fri Jan 22 17:43:39 2016 +0100 +++ b/Python/pythonrun.c Fri Jan 22 23:19:28 2016 +0100 @@ -1024,7 +1024,7 @@ Py_CompileStringObject(const char *str, PyArena_Free(arena); return NULL; } - if (flags && (flags->cf_flags & PyCF_ONLY_AST)) { + if (flags && (flags->cf_flags & (PyCF_ONLY_AST | PyCF_TRANSFORMED_AST))) { PyObject *result = PyAST_mod2obj(mod); PyArena_Free(arena); return result; @@ -1112,7 +1112,8 @@ ast_transformers_context(PyObject *filen } static mod_ty -ast_transformers(mod_ty mod, PyArena *arena, PyObject *filename, int start) +ast_transformers(mod_ty mod, PyArena *arena, int cf_flags, + PyObject *filename, int start) { PyObject *ast, *context = NULL; int mode; @@ -1121,6 +1122,9 @@ ast_transformers(mod_ty mod, PyArena *ar assert(filename != NULL); + if (cf_flags & PyCF_ONLY_AST) + return mod; + if (_PySys_GetCodeTransformers(&transformers, &ntransformer) < 0) { PyErr_SetString(PyExc_RuntimeError, "failed to get code transformers"); @@ -1223,7 +1227,7 @@ PyParser_ASTFromStringObject(const char if (mod == NULL) return NULL; - return ast_transformers(mod, arena, filename, start); + return ast_transformers(mod, arena, flags->cf_flags, filename, start); } mod_ty @@ -1273,7 +1277,7 @@ PyParser_ASTFromFileObject(FILE *fp, PyO if (mod == NULL) return NULL; - return ast_transformers(mod, arena, filename, start); + return ast_transformers(mod, arena, flags->cf_flags, filename, start); } mod_ty