Mercurial > cpython-lru_cache-weakref
diff Python/pythonrun.c @ 18615:0a90e5ec61b6 legacy-trunk
Ugly. A pile of new xxxFlags() functions, to communicate to the parser
that 'yield' is a keyword. This doesn't help test_generators at all! I
don't know why not. These things do work now (and didn't before this
patch):
1. "from __future__ import generators" now works in a native shell.
2. Similarly "python -i xxx.py" now has generators enabled in the
shell if xxx.py had them enabled.
3. This program (which was my doctest proxy) works fine:
from __future__ import generators
source = """\
def f():
yield 1
"""
exec compile(source, "", "single") in globals()
print type(f())
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Mon, 16 Jul 2001 05:37:24 +0000 |
| parents | 4ac98fe7abd2 |
| children | c9b4c8ae6179 |
line wrap: on
line diff
--- a/Python/pythonrun.c Mon Jul 16 05:25:12 2001 +0000 +++ b/Python/pythonrun.c Mon Jul 16 05:37:24 2001 +0000 @@ -533,6 +533,7 @@ node *n; perrdetail err; char *ps1 = "", *ps2 = ""; + v = PySys_GetObject("ps1"); if (v != NULL) { v = PyObject_Str(v); @@ -549,8 +550,11 @@ else if (PyString_Check(w)) ps2 = PyString_AsString(w); } - n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, - Py_single_input, ps1, ps2, &err); + n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, + Py_single_input, ps1, ps2, &err, + (flags && + flags->cf_flags & PyCF_GENERATORS) ? + PyPARSE_YIELD_IS_KEYWORD : 0); Py_XDECREF(v); Py_XDECREF(w); if (n == NULL) { @@ -1017,7 +1021,9 @@ PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags) { - node *n = PyParser_SimpleParseFile(fp, filename, start); + node *n = PyParser_SimpleParseFileFlags(fp, filename, start, + (flags && flags->cf_flags & PyCF_GENERATORS) ? + PyPARSE_YIELD_IS_KEYWORD : 0); if (closeit) fclose(fp); return run_err_node(n, filename, globals, locals, flags); @@ -1101,7 +1107,9 @@ { node *n; PyCodeObject *co; - n = PyParser_SimpleParseString(str, start); + n = PyParser_SimpleParseStringFlags(str, start, + (flags && flags->cf_flags & PyCF_GENERATORS) ? + PyPARSE_YIELD_IS_KEYWORD : 0); if (n == NULL) return NULL; co = PyNode_CompileFlags(n, filename, flags); @@ -1125,28 +1133,41 @@ /* Simplified interface to parsefile -- return node or set exception */ node * -PyParser_SimpleParseFile(FILE *fp, char *filename, int start) +PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags) { node *n; perrdetail err; - n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start, - (char *)0, (char *)0, &err); + n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, + (char *)0, (char *)0, &err, flags); if (n == NULL) err_input(&err); return n; } +node * +PyParser_SimpleParseFile(FILE *fp, char *filename, int start) +{ + return PyParser_SimpleParseFileFlags(fp, filename, start, 0); +} + /* Simplified interface to parsestring -- return node or set exception */ node * +PyParser_SimpleParseStringFlags(char *str, int start, int flags) +{ + node *n; + perrdetail err; + n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err, + flags); + if (n == NULL) + err_input(&err); + return n; +} + +node * PyParser_SimpleParseString(char *str, int start) { - node *n; - perrdetail err; - n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err); - if (n == NULL) - err_input(&err); - return n; + return PyParser_SimpleParseStringFlags(str, start, 0); } /* Set the error appropriate to the given input error code (see errcode.h) */
