diff options
author | Benjamin Peterson <benjamin@python.org> | 2008-10-31 02:28:05 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2008-10-31 02:28:05 (GMT) |
commit | f216c9427dc880f64bd38d7f0345f038a45d3123 (patch) | |
tree | 32faa3bb6ffbf5378c0cd8c1bbd422c907f54310 /Modules/parsermodule.c | |
parent | dd8059f0781d5af09b25ee5a0683c16cf5ff4d2a (diff) | |
download | cpython-f216c9427dc880f64bd38d7f0345f038a45d3123.zip cpython-f216c9427dc880f64bd38d7f0345f038a45d3123.tar.gz cpython-f216c9427dc880f64bd38d7f0345f038a45d3123.tar.bz2 |
Merged revisions 67066 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r67066 | benjamin.peterson | 2008-10-30 21:16:05 -0500 (Thu, 30 Oct 2008) | 5 lines
make sure the parser flags and passed onto the compiler
This fixes "from __future__ import unicode_literals" in an exec statment
See #4225
........
Diffstat (limited to 'Modules/parsermodule.c')
-rw-r--r-- | Modules/parsermodule.c | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 2a61eec..652b07c 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -26,12 +26,20 @@ */ #include "Python.h" /* general Python API */ +#include "Python-ast.h" /* mod_ty */ #include "graminit.h" /* symbols defined in the grammar */ #include "node.h" /* internal parser structure */ #include "errcode.h" /* error codes for PyNode_*() */ #include "token.h" /* token definitions */ +#include "grammar.h" +#include "parsetok.h" /* ISTERMINAL() / ISNONTERMINAL() */ -#include "compile.h" /* PyNode_Compile() */ +#include "compile.h" +#undef Yield +#include "ast.h" +#include "pyarena.h" + +extern grammar _PyParser_Grammar; /* From graminit.c */ #ifdef lint #include <note.h> @@ -156,6 +164,7 @@ typedef struct { PyObject_HEAD /* standard object header */ node* st_node; /* the node* returned by the parser */ int st_type; /* EXPR or SUITE ? */ + PyCompilerFlags st_flags; /* Parser and compiler flags */ } PyST_Object; @@ -287,6 +296,7 @@ parser_newstobject(node *st, int type) if (o != 0) { o->st_node = st; o->st_type = type; + o->st_flags.cf_flags = 0; } else { PyNode_Free(st); @@ -405,6 +415,8 @@ static PyObject* parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw) { PyObject* res = 0; + PyArena* arena; + mod_ty mod; char* str = "<syntax-tree>"; int ok; @@ -417,8 +429,16 @@ parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw) ok = PyArg_ParseTupleAndKeywords(args, kw, "|s:compile", &keywords[1], &str); - if (ok) - res = (PyObject *)PyNode_Compile(self->st_node, str); + if (ok) { + arena = PyArena_New(); + if (arena) { + mod = PyAST_FromNode(self->st_node, &(self->st_flags), str, arena); + if (mod) { + res = (PyObject *)PyAST_Compile(mod, str, &(self->st_flags), arena); + } + PyArena_Free(arena); + } + } return (res); } @@ -500,16 +520,25 @@ parser_do_parse(PyObject *args, PyObject *kw, char *argspec, int type) { char* string = 0; PyObject* res = 0; + int flags = 0; + perrdetail err; static char *keywords[] = {"source", NULL}; if (PyArg_ParseTupleAndKeywords(args, kw, argspec, keywords, &string)) { - node* n = PyParser_SimpleParseString(string, - (type == PyST_EXPR) - ? eval_input : file_input); + node* n = PyParser_ParseStringFlagsFilenameEx(string, NULL, + &_PyParser_Grammar, + (type == PyST_EXPR) + ? eval_input : file_input, + &err, &flags); - if (n) + if (n) { res = parser_newstobject(n, type); + if (res) + ((PyST_Object *)res)->st_flags.cf_flags = flags & PyCF_MASK; + } + else + PyParser_SetError(&err); } return (res); } |