[Python-checkins] CVS: python/dist/src/Python pythonrun.c,2.136,2.137

Tim Peters tim_one@users.sourceforge.net
2001年7月15日 22:37:26 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv22251/python/dist/src/Python
Modified Files:
	pythonrun.c 
Log Message:
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())
Index: pythonrun.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/pythonrun.c,v
retrieving revision 2.136
retrieving revision 2.137
diff -C2 -r2.136 -r2.137
*** pythonrun.c	2001年07月16日 03:11:48	2.136
--- pythonrun.c	2001年07月16日 05:37:24	2.137
***************
*** 534,537 ****
--- 534,538 ----
 	perrdetail err;
 	char *ps1 = "", *ps2 = "";
+ 
 	v = PySys_GetObject("ps1");
 	if (v != NULL) {
***************
*** 550,555 ****
 			ps2 = PyString_AsString(w);
 	}
! 	n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
! 			 Py_single_input, ps1, ps2, &err);
 	Py_XDECREF(v);
 	Py_XDECREF(w);
--- 551,559 ----
 			ps2 = PyString_AsString(w);
 	}
! 	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);
***************
*** 1018,1022 ****
 		 PyObject *locals, int closeit, PyCompilerFlags *flags)
 {
! 	node *n = PyParser_SimpleParseFile(fp, filename, start);
 	if (closeit)
 		fclose(fp);
--- 1022,1028 ----
 		 PyObject *locals, int closeit, PyCompilerFlags *flags)
 {
! 	node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
! 			(flags && flags->cf_flags & PyCF_GENERATORS) ?
! 				PyPARSE_YIELD_IS_KEYWORD : 0);
 	if (closeit)
 		fclose(fp);
***************
*** 1102,1106 ****
 	node *n;
 	PyCodeObject *co;
! 	n = PyParser_SimpleParseString(str, start);
 	if (n == NULL)
 		return NULL;
--- 1108,1114 ----
 	node *n;
 	PyCodeObject *co;
! 	n = PyParser_SimpleParseStringFlags(str, start,
! 		(flags && flags->cf_flags & PyCF_GENERATORS) ?
! 			PyPARSE_YIELD_IS_KEYWORD : 0);
 	if (n == NULL)
 		return NULL;
***************
*** 1126,1135 ****
 
 node *
! PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
 {
 	node *n;
 	perrdetail err;
! 	n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
! 				(char *)0, (char *)0, &err);
 	if (n == NULL)
 		err_input(&err);
--- 1134,1143 ----
 
 node *
! PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
 {
 	node *n;
 	perrdetail err;
! 	n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
! 					(char *)0, (char *)0, &err, flags);
 	if (n == NULL)
 		err_input(&err);
***************
*** 1137,1151 ****
 }
 
 /* Simplified interface to parsestring -- return node or set exception */
 
 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;
 }
 
--- 1145,1172 ----
 }
 
+ 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)
+ {
+ 	return PyParser_SimpleParseStringFlags(str, start, 0);
 }
 

AltStyle によって変換されたページ (->オリジナル) /