From: Finn B. <bc...@us...> - 2002-10-15 14:32:31
|
Update of /cvsroot/jython/jython/org/python/core In directory usw-pr-cvs1:/tmp/cvs-serv28207/core Modified Files: CompilerFlags.java PyFrame.java PyTableCode.java __builtin__.java parser.java Added Files: PyGenerator.java Log Message: Support for generators. --- NEW FILE: PyGenerator.java --- // Copyright 2002 Finn Bock package org.python.core; public class PyGenerator extends PyIterator { public PyFrame gi_frame; PyObject closure; public boolean gi_running; public PyGenerator(PyFrame frame, PyObject closure) { this.gi_frame = frame; this.closure = closure; this.gi_running = false; } private static final String[] __members__ = { "gi_frame", "gi_running", "next", }; public PyObject __dir__() { PyString members[] = new PyString[__members__.length]; for (int i = 0; i < __members__.length; i++) members[i] = new PyString(__members__[i]); PyList ret = new PyList(members); addKeys(ret, "__dict__"); ret.sort(); return ret; } public PyObject __iternext__() { if (gi_running) throw Py.ValueError("generator already executing"); if (gi_frame.f_lasti == -1) return null; gi_running = true; PyObject result = null; try { result = gi_frame.f_code.call(gi_frame, closure); } finally { gi_running = false; } // System.out.println("lasti:" + gi_frame.f_lasti); //if (result == Py.None) // new Exception().printStackTrace(); if (result == Py.None && gi_frame.f_lasti == -1) return null; return result; } } Index: CompilerFlags.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/CompilerFlags.java,v retrieving revision 2.7 retrieving revision 2.8 diff -C2 -d -r2.7 -r2.8 *** CompilerFlags.java 11 Jun 2002 12:07:06 -0000 2.7 --- CompilerFlags.java 15 Oct 2002 14:32:28 -0000 2.8 *************** *** 7,16 **** public CompilerFlags(int co_flags) { ! if ((co_flags&org.python.core.PyTableCode.CO_NESTED) != 0) nested_scopes = true; } public boolean nested_scopes = true; public boolean division; // 'interactive' is true when reading from the console. --- 7,24 ---- public CompilerFlags(int co_flags) { ! if ((co_flags & org.python.core.PyTableCode.CO_NESTED) != 0) nested_scopes = true; + if ((co_flags & org.python.core.PyTableCode.CO_FUTUREDIVISION) != 0) + division = true; + if ((co_flags & org.python.core.PyTableCode.CO_GENERATOR) != 0) + generator = true; + if ((co_flags & org.python.core.PyTableCode.CO_GENERATOR_ALLOWED) != 0) + generator_allowed = true; } public boolean nested_scopes = true; public boolean division; + public boolean generator; + public boolean generator_allowed; // 'interactive' is true when reading from the console. Index: PyFrame.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyFrame.java,v retrieving revision 2.13 retrieving revision 2.14 diff -C2 -d -r2.13 -r2.14 *** PyFrame.java 27 Nov 2001 19:07:21 -0000 2.13 --- PyFrame.java 15 Oct 2002 14:32:28 -0000 2.14 *************** *** 19,22 **** --- 19,24 ---- public int f_ncells; public int f_nfreevars; + public int f_lasti; + public Object[] f_savedlocals; // an interface to functions suitable for tracing, e.g. via sys.settrace() Index: PyTableCode.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyTableCode.java,v retrieving revision 2.19 retrieving revision 2.20 diff -C2 -d -r2.19 -r2.20 *** PyTableCode.java 13 Jan 2002 18:17:55 -0000 2.19 --- PyTableCode.java 15 Oct 2002 14:32:28 -0000 2.20 *************** *** 28,31 **** --- 28,33 ---- final public static int CO_VARKEYWORDS = 0x0008; final public static int CO_NESTED = 0x0010; + final public static int CO_GENERATOR = 0x0020; + final public static int CO_GENERATOR_ALLOWED = 0x1000; final public static int CO_FUTUREDIVISION = 0x2000; *************** *** 220,223 **** --- 222,227 ---- } + frame.f_lasti = -1; + if (frame.tracefunc != null) { frame.tracefunc.traceException(frame, e); *************** *** 255,258 **** --- 259,265 ---- closure); PyFrame frame = new PyFrame(this, globals); + if ((co_flags & CO_GENERATOR) != 0) { + return new PyGenerator(frame, closure); + } return call(frame, closure); } *************** *** 266,269 **** --- 273,279 ---- PyFrame frame = new PyFrame(this, globals); frame.f_fastlocals[0] = arg1; + if ((co_flags & CO_GENERATOR) != 0) { + return new PyGenerator(frame, closure); + } return call(frame, closure); } *************** *** 278,281 **** --- 288,294 ---- frame.f_fastlocals[0] = arg1; frame.f_fastlocals[1] = arg2; + if ((co_flags & CO_GENERATOR) != 0) { + return new PyGenerator(frame, closure); + } return call(frame, closure); } *************** *** 292,295 **** --- 305,311 ---- frame.f_fastlocals[1] = arg2; frame.f_fastlocals[2] = arg3; + if ((co_flags & CO_GENERATOR) != 0) { + return new PyGenerator(frame, closure); + } return call(frame, closure); } *************** *** 402,405 **** --- 418,424 ---- actual_args[nargs-1] = extra_keywords; } + } + if ((co_flags & CO_GENERATOR) != 0) { + return new PyGenerator(my_frame, closure); } return call(my_frame, closure); Index: __builtin__.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/__builtin__.java,v retrieving revision 2.50 retrieving revision 2.51 diff -C2 -d -r2.50 -r2.51 *** __builtin__.java 19 Sep 2002 10:19:46 -0000 2.50 --- __builtin__.java 15 Oct 2002 14:32:28 -0000 2.51 *************** *** 218,221 **** --- 218,226 ---- } + public static PyCode compile(String data, String filename, String type, + int flags, boolean inherit) { + return Py.compile_flags(data,filename,type,new CompilerFlags(flags)); + } + public static PyComplex complex(PyObject real, PyObject imag) { if (real instanceof PyString) *************** *** 506,510 **** return new PyList(a); } ! return new PyList(make_array(o)); } --- 511,515 ---- return new PyList(a); } ! return new PyList(o); } Index: parser.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/parser.java,v retrieving revision 2.16 retrieving revision 2.17 diff -C2 -d -r2.16 -r2.17 *** parser.java 11 Jun 2002 12:07:06 -0000 2.16 --- parser.java 15 Oct 2002 14:32:28 -0000 2.17 *************** *** 110,113 **** --- 110,115 ---- PythonGrammar g = new PythonGrammar(new ReaderCharStream(bufreader)); + if (cflags != null) + g.token_source.generator_allowed = cflags.generator_allowed; modType node = null; try { |