Mercurial > cpython-lru_cache-weakref
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 18614:384a61fa6f5a | 18615:0a90e5ec61b6 |
|---|---|
| 531 { | 531 { |
| 532 PyObject *m, *d, *v, *w; | 532 PyObject *m, *d, *v, *w; |
| 533 node *n; | 533 node *n; |
| 534 perrdetail err; | 534 perrdetail err; |
| 535 char *ps1 = "", *ps2 = ""; | 535 char *ps1 = "", *ps2 = ""; |
| 536 | |
| 536 v = PySys_GetObject("ps1"); | 537 v = PySys_GetObject("ps1"); |
| 537 if (v != NULL) { | 538 if (v != NULL) { |
| 538 v = PyObject_Str(v); | 539 v = PyObject_Str(v); |
| 539 if (v == NULL) | 540 if (v == NULL) |
| 540 PyErr_Clear(); | 541 PyErr_Clear(); |
| 547 if (w == NULL) | 548 if (w == NULL) |
| 548 PyErr_Clear(); | 549 PyErr_Clear(); |
| 549 else if (PyString_Check(w)) | 550 else if (PyString_Check(w)) |
| 550 ps2 = PyString_AsString(w); | 551 ps2 = PyString_AsString(w); |
| 551 } | 552 } |
| 552 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, | 553 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, |
| 553 Py_single_input, ps1, ps2, &err); | 554 Py_single_input, ps1, ps2, &err, |
| 555 (flags && | |
| 556 flags->cf_flags & PyCF_GENERATORS) ? | |
| 557 PyPARSE_YIELD_IS_KEYWORD : 0); | |
| 554 Py_XDECREF(v); | 558 Py_XDECREF(v); |
| 555 Py_XDECREF(w); | 559 Py_XDECREF(w); |
| 556 if (n == NULL) { | 560 if (n == NULL) { |
| 557 if (err.error == E_EOF) { | 561 if (err.error == E_EOF) { |
| 558 if (err.text) | 562 if (err.text) |
| 1015 | 1019 |
| 1016 PyObject * | 1020 PyObject * |
| 1017 PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals, | 1021 PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals, |
| 1018 PyObject *locals, int closeit, PyCompilerFlags *flags) | 1022 PyObject *locals, int closeit, PyCompilerFlags *flags) |
| 1019 { | 1023 { |
| 1020 node *n = PyParser_SimpleParseFile(fp, filename, start); | 1024 node *n = PyParser_SimpleParseFileFlags(fp, filename, start, |
| 1025 (flags && flags->cf_flags & PyCF_GENERATORS) ? | |
| 1026 PyPARSE_YIELD_IS_KEYWORD : 0); | |
| 1021 if (closeit) | 1027 if (closeit) |
| 1022 fclose(fp); | 1028 fclose(fp); |
| 1023 return run_err_node(n, filename, globals, locals, flags); | 1029 return run_err_node(n, filename, globals, locals, flags); |
| 1024 } | 1030 } |
| 1025 | 1031 |
| 1099 Py_CompileStringFlags(char *str, char *filename, int start, | 1105 Py_CompileStringFlags(char *str, char *filename, int start, |
| 1100 PyCompilerFlags *flags) | 1106 PyCompilerFlags *flags) |
| 1101 { | 1107 { |
| 1102 node *n; | 1108 node *n; |
| 1103 PyCodeObject *co; | 1109 PyCodeObject *co; |
| 1104 n = PyParser_SimpleParseString(str, start); | 1110 n = PyParser_SimpleParseStringFlags(str, start, |
| 1111 (flags && flags->cf_flags & PyCF_GENERATORS) ? | |
| 1112 PyPARSE_YIELD_IS_KEYWORD : 0); | |
| 1105 if (n == NULL) | 1113 if (n == NULL) |
| 1106 return NULL; | 1114 return NULL; |
| 1107 co = PyNode_CompileFlags(n, filename, flags); | 1115 co = PyNode_CompileFlags(n, filename, flags); |
| 1108 PyNode_Free(n); | 1116 PyNode_Free(n); |
| 1109 return (PyObject *)co; | 1117 return (PyObject *)co; |
| 1123 } | 1131 } |
| 1124 | 1132 |
| 1125 /* Simplified interface to parsefile -- return node or set exception */ | 1133 /* Simplified interface to parsefile -- return node or set exception */ |
| 1126 | 1134 |
| 1127 node * | 1135 node * |
| 1128 PyParser_SimpleParseFile(FILE *fp, char *filename, int start) | 1136 PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags) |
| 1129 { | 1137 { |
| 1130 node *n; | 1138 node *n; |
| 1131 perrdetail err; | 1139 perrdetail err; |
| 1132 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start, | 1140 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, |
| 1133 (char *)0, (char *)0, &err); | 1141 (char *)0, (char *)0, &err, flags); |
| 1134 if (n == NULL) | 1142 if (n == NULL) |
| 1135 err_input(&err); | 1143 err_input(&err); |
| 1136 return n; | 1144 return n; |
| 1137 } | 1145 } |
| 1138 | 1146 |
| 1147 node * | |
| 1148 PyParser_SimpleParseFile(FILE *fp, char *filename, int start) | |
| 1149 { | |
| 1150 return PyParser_SimpleParseFileFlags(fp, filename, start, 0); | |
| 1151 } | |
| 1152 | |
| 1139 /* Simplified interface to parsestring -- return node or set exception */ | 1153 /* Simplified interface to parsestring -- return node or set exception */ |
| 1140 | 1154 |
| 1141 node * | 1155 node * |
| 1142 PyParser_SimpleParseString(char *str, int start) | 1156 PyParser_SimpleParseStringFlags(char *str, int start, int flags) |
| 1143 { | 1157 { |
| 1144 node *n; | 1158 node *n; |
| 1145 perrdetail err; | 1159 perrdetail err; |
| 1146 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err); | 1160 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err, |
| 1161 flags); | |
| 1147 if (n == NULL) | 1162 if (n == NULL) |
| 1148 err_input(&err); | 1163 err_input(&err); |
| 1149 return n; | 1164 return n; |
| 1165 } | |
| 1166 | |
| 1167 node * | |
| 1168 PyParser_SimpleParseString(char *str, int start) | |
| 1169 { | |
| 1170 return PyParser_SimpleParseStringFlags(str, start, 0); | |
| 1150 } | 1171 } |
| 1151 | 1172 |
| 1152 /* Set the error appropriate to the given input error code (see errcode.h) */ | 1173 /* Set the error appropriate to the given input error code (see errcode.h) */ |
| 1153 | 1174 |
| 1154 static void | 1175 static void |
