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