From: <pj...@us...> - 2008-10-20 21:18:17
|
Revision: 5485 http://jython.svn.sourceforge.net/jython/?rev=5485&view=rev Author: pjenvey Date: 2008-10-20 21:18:08 +0000 (Mon, 20 Oct 2008) Log Message: ----------- o delete references to test.test_ modules in the test package after running them to conserve memory o bump ant regrtest's heap to 144m which is about the minimum needed for Apple's 64 bit Java 6 (server VM) Modified Paths: -------------- trunk/jython/Lib/test/regrtest.py trunk/jython/build.xml Modified: trunk/jython/Lib/test/regrtest.py =================================================================== --- trunk/jython/Lib/test/regrtest.py 2008-10-20 20:05:02 UTC (rev 5484) +++ trunk/jython/Lib/test/regrtest.py 2008-10-20 21:18:08 UTC (rev 5485) @@ -168,6 +168,7 @@ newsoft = min(hard, max(soft, 1024*2048)) resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard)) +import test as _test from test import test_support RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', @@ -416,6 +417,9 @@ for module in sys.modules.keys(): if module not in save_modules and module.startswith("test."): test_support.unload(module) + module = module[5:] + if hasattr(_test, module): + delattr(_test, module) # The lists won't be sorted if running with -r good.sort() Modified: trunk/jython/build.xml =================================================================== --- trunk/jython/build.xml 2008-10-20 20:05:02 UTC (rev 5484) +++ trunk/jython/build.xml 2008-10-20 21:18:08 UTC (rev 5485) @@ -171,7 +171,9 @@ <pathelement path="${exposed.dir}" /> <pathelement path="${compile.dir}" /> </path> - <property name="regrtest.Xmx" value="-Xmx96m" /> + <!-- 64 bit Java 6 needs about 96m for regrtest on most platforms, but Apple's needs + 144m --> + <property name="regrtest.Xmx" value="-Xmx144m" /> </target> <target name="version-init"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-21 00:21:56
|
Revision: 5489 http://jython.svn.sourceforge.net/jython/?rev=5489&view=rev Author: fwierzbicki Date: 2008-10-21 00:21:45 +0000 (Tue, 21 Oct 2008) Log Message: ----------- moved test138 to test_str_jy. Modified Paths: -------------- trunk/jython/Lib/test/test_str_jy.py Removed Paths: ------------- trunk/jython/bugtests/test138.py Modified: trunk/jython/Lib/test/test_str_jy.py =================================================================== --- trunk/jython/Lib/test/test_str_jy.py 2008-10-20 23:54:14 UTC (rev 5488) +++ trunk/jython/Lib/test/test_str_jy.py 2008-10-21 00:21:45 UTC (rev 5489) @@ -130,6 +130,12 @@ self.assertEqual(repr(test2), '"\'bar"') self.assertEqual(repr(unicode(test2)), 'u"\'bar"') + def test_startswith(self): + #from bugtests -- maybe making sure methods are case sensative? + msg = 'This is a test.' + self.assertRaises(AttributeError, getattr, msg, "startsWith") + assert msg.startswith('This') + def test_main(): test_support.run_unittest(WrappedStrCmpTest, IntToStrTest, Deleted: trunk/jython/bugtests/test138.py =================================================================== --- trunk/jython/bugtests/test138.py 2008-10-20 23:54:14 UTC (rev 5488) +++ trunk/jython/bugtests/test138.py 2008-10-21 00:21:45 UTC (rev 5489) @@ -1,17 +0,0 @@ -""" - -""" - -import support - -msg = 'This is a test.' - -try: - msg.startsWith('This') -except AttributeError, e: - pass -else: - raise support.TestError("startsWith should not be defined") - -if not msg.startswith('This'): - raise support.TestError("startswith error") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-21 18:44:14
|
Revision: 5498 http://jython.svn.sourceforge.net/jython/?rev=5498&view=rev Author: pjenvey Date: 2008-10-21 18:44:08 +0000 (Tue, 21 Oct 2008) Log Message: ----------- IOErrors are expected for unsupported file operations, instead of TypeErrors Modified Paths: -------------- trunk/jython/Lib/test/test_java_integration.py trunk/jython/src/org/python/core/io/IOBase.java Modified: trunk/jython/Lib/test/test_java_integration.py =================================================================== --- trunk/jython/Lib/test/test_java_integration.py 2008-10-21 10:53:16 UTC (rev 5497) +++ trunk/jython/Lib/test/test_java_integration.py 2008-10-21 18:44:08 UTC (rev 5498) @@ -154,6 +154,10 @@ from java.io import FileInputStream, FileNotFoundException self.assertRaises(FileNotFoundException, FileInputStream, "garbage") + def test_unsupported(self): + fp = open(System.out) + self.assertRaises(IOError, fp.tell) + class VectorTest(unittest.TestCase): def test_looping(self): Modified: trunk/jython/src/org/python/core/io/IOBase.java =================================================================== --- trunk/jython/src/org/python/core/io/IOBase.java 2008-10-21 10:53:16 UTC (rev 5497) +++ trunk/jython/src/org/python/core/io/IOBase.java 2008-10-21 18:44:08 UTC (rev 5498) @@ -210,6 +210,6 @@ protected void unsupported(String methodName) { String qualifiedName = getClass().getName(); String className = qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1); - throw Py.TypeError(String.format("%s.%s() not supported", className, methodName)); + throw Py.IOError(String.format("%s.%s() not supported", className, methodName)); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-21 20:02:06
|
Revision: 5499 http://jython.svn.sourceforge.net/jython/?rev=5499&view=rev Author: fwierzbicki Date: 2008-10-21 20:02:03 +0000 (Tue, 21 Oct 2008) Log Message: ----------- Allow error handling to be customized in the case of token mismatch calls during parsing. Modified Paths: -------------- trunk/jython/grammar/Python.g trunk/jython/src/org/python/antlr/ErrorHandler.java trunk/jython/src/org/python/antlr/FailFastHandler.java trunk/jython/src/org/python/antlr/ListErrorHandler.java Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2008-10-21 18:44:08 UTC (rev 5498) +++ trunk/jython/grammar/Python.g 2008-10-21 20:02:03 UTC (rev 5499) @@ -165,21 +165,19 @@ } protected void mismatch(IntStream input, int ttype, BitSet follow) throws RecognitionException { - if (errorHandler.isRecoverable()) { + if (errorHandler.mismatch(this, input, ttype, follow)) { super.mismatch(input, ttype, follow); - } else { - throw new MismatchedTokenException(ttype, input); } } protected Object recoverFromMismatchedToken(IntStream input, int ttype, BitSet follow) - throws RecognitionException - { - if (errorHandler.isRecoverable()) { - return super.recoverFromMismatchedToken(input, ttype, follow); + throws RecognitionException { + + Object o = errorHandler.recoverFromMismatchedToken(this, input, ttype, follow); + if (o != null) { + return o; } - mismatch(input, ttype, follow); - return null; + return super.recoverFromMismatchedToken(input, ttype, follow); } } Modified: trunk/jython/src/org/python/antlr/ErrorHandler.java =================================================================== --- trunk/jython/src/org/python/antlr/ErrorHandler.java 2008-10-21 18:44:08 UTC (rev 5498) +++ trunk/jython/src/org/python/antlr/ErrorHandler.java 2008-10-21 20:02:03 UTC (rev 5499) @@ -1,6 +1,7 @@ package org.python.antlr; import org.antlr.runtime.BaseRecognizer; +import org.antlr.runtime.BitSet; import org.antlr.runtime.IntStream; import org.antlr.runtime.Lexer; import org.antlr.runtime.RecognitionException; @@ -13,7 +14,19 @@ void reportError(BaseRecognizer br, RecognitionException re); void recover(BaseRecognizer br, IntStream input, RecognitionException re); void recover(Lexer lex, RecognitionException re); - boolean isRecoverable(); + + /** + * @return True if the caller should handle the mismatch + */ + boolean mismatch(BaseRecognizer br, IntStream input, int ttype, BitSet follow) + throws RecognitionException; + + /** + * @return null if the caller should handle the mismatch + */ + Object recoverFromMismatchedToken(BaseRecognizer br, IntStream input, int ttype, BitSet follow) + throws RecognitionException; + //exprType, modType, sliceType, stmtType exprType errorExpr(PythonTree t); modType errorMod(PythonTree t); Modified: trunk/jython/src/org/python/antlr/FailFastHandler.java =================================================================== --- trunk/jython/src/org/python/antlr/FailFastHandler.java 2008-10-21 18:44:08 UTC (rev 5498) +++ trunk/jython/src/org/python/antlr/FailFastHandler.java 2008-10-21 20:02:03 UTC (rev 5499) @@ -1,8 +1,10 @@ package org.python.antlr; import org.antlr.runtime.BaseRecognizer; +import org.antlr.runtime.BitSet; import org.antlr.runtime.IntStream; import org.antlr.runtime.Lexer; +import org.antlr.runtime.MismatchedTokenException; import org.antlr.runtime.RecognitionException; import org.python.antlr.ast.ErrorMod; import org.python.antlr.ast.exprType; @@ -27,10 +29,17 @@ throw new ParseException(message(br,re), re); } - public boolean isRecoverable() { - return false; + public boolean mismatch(BaseRecognizer br, IntStream input, int ttype, BitSet follow) + throws RecognitionException { + + throw new MismatchedTokenException(ttype, input); } + public Object recoverFromMismatchedToken(BaseRecognizer br, IntStream input, int ttype, + BitSet follow) throws RecognitionException { + throw new MismatchedTokenException(ttype, input); + } + public exprType errorExpr(PythonTree t) { throw new ParseException("Bad Expr Node", t); } Modified: trunk/jython/src/org/python/antlr/ListErrorHandler.java =================================================================== --- trunk/jython/src/org/python/antlr/ListErrorHandler.java 2008-10-21 18:44:08 UTC (rev 5498) +++ trunk/jython/src/org/python/antlr/ListErrorHandler.java 2008-10-21 20:02:03 UTC (rev 5499) @@ -1,6 +1,7 @@ package org.python.antlr; import org.antlr.runtime.BaseRecognizer; +import org.antlr.runtime.BitSet; import org.antlr.runtime.IntStream; import org.antlr.runtime.Lexer; import org.antlr.runtime.RecognitionException; @@ -27,10 +28,14 @@ br.recover(input, re); } - public boolean isRecoverable() { + public boolean mismatch(BaseRecognizer br, IntStream input, int ttype, BitSet follow) { return true; } + public Object recoverFromMismatchedToken(BaseRecognizer br, IntStream input, int ttype, BitSet follow) { + return null; + } + public exprType errorExpr(PythonTree t) { return new ErrorExpr(t); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2008-10-22 08:32:04
|
Revision: 5504 http://jython.svn.sourceforge.net/jython/?rev=5504&view=rev Author: cgroves Date: 2008-10-22 08:27:42 +0000 (Wed, 22 Oct 2008) Log Message: ----------- Expose PyGenerator so we can control the visibility of gi_running. test_generators checks on __doc__ from next on generators, so this commit adds docstrings to exposed methods to satisfy that requirement. Modified Paths: -------------- trunk/jython/CoreExposed.includes trunk/jython/src/org/python/core/PyBuiltinCallable.java trunk/jython/src/org/python/core/PyBuiltinFunction.java trunk/jython/src/org/python/core/PyGenerator.java trunk/jython/src/org/python/core/PyIterator.java trunk/jython/src/org/python/core/PyObject.java trunk/jython/src/org/python/expose/ExposedMethod.java trunk/jython/src/org/python/expose/generate/ClassMethodExposer.java trunk/jython/src/org/python/expose/generate/ExposedMethodFinder.java trunk/jython/src/org/python/expose/generate/InstanceMethodExposer.java trunk/jython/src/org/python/expose/generate/MethodExposer.java trunk/jython/tests/java/org/python/expose/generate/MethodExposerTest.java Modified: trunk/jython/CoreExposed.includes =================================================================== --- trunk/jython/CoreExposed.includes 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/CoreExposed.includes 2008-10-22 08:27:42 UTC (rev 5504) @@ -16,6 +16,7 @@ org/python/core/PyFloat.class org/python/core/PyFrozenSet.class org/python/core/PyFunction.class +org/python/core/PyGenerator.class org/python/core/PyInteger.class org/python/core/PyList.class org/python/core/PyLong.class Modified: trunk/jython/src/org/python/core/PyBuiltinCallable.java =================================================================== --- trunk/jython/src/org/python/core/PyBuiltinCallable.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/core/PyBuiltinCallable.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -9,6 +9,8 @@ protected Info info; + protected String doc; + protected PyBuiltinCallable(PyType type, Info info) { super(type); this.info = info; @@ -29,8 +31,8 @@ } @ExposedGet(name = "__doc__") - public PyObject fastGetDoc() { - return Py.None; + public String fastGetDoc() { + return doc; } @ExposedGet(name = "__module__") Modified: trunk/jython/src/org/python/core/PyBuiltinFunction.java =================================================================== --- trunk/jython/src/org/python/core/PyBuiltinFunction.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/core/PyBuiltinFunction.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -4,21 +4,15 @@ public class PyBuiltinFunction extends PyBuiltinCallable implements ExposeAsSuperclass { - private PyString doc; - protected PyBuiltinFunction(String name, String doc) { this(name, -1, -1, doc); } protected PyBuiltinFunction(String name, int minargs, int maxargs, String doc) { super(new DefaultInfo(name, minargs, maxargs)); - this.doc = doc == null ? null : Py.newString(doc); + this.doc = doc == null ? null : doc; } - public PyObject fastGetDoc() { - return doc; - } - public boolean isMappingType() { return false; } Modified: trunk/jython/src/org/python/core/PyGenerator.java =================================================================== --- trunk/jython/src/org/python/core/PyGenerator.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/core/PyGenerator.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -1,39 +1,33 @@ -// Copyright 2002 Finn Bock - package org.python.core; +import org.python.expose.ExposedGet; +import org.python.expose.ExposedMethod; +import org.python.expose.ExposedType; + +@ExposedType(name="generator", base=PyObject.class) public class PyGenerator extends PyIterator { - public PyFrame gi_frame; - PyObject closure; - public boolean gi_running; + + @ExposedGet + protected PyFrame gi_frame; + + @ExposedGet + protected boolean gi_running; + private PyException generatorExit; + private PyObject closure; + public PyGenerator(PyFrame frame, PyObject closure) { - this.gi_frame = frame; + gi_frame = frame; this.closure = closure; - this.gi_running = false; - // Create an exception instance while we have a frame to create it from. - // When the GC runs it doesn't have any associated thread state. - // this is necessary for finalize calling close on the generator - this.generatorExit = Py.makeException(Py.GeneratorExit); - } - private static final String[] __members__ = { - "close", "gi_frame", "gi_running", "next", "send", "throw" - }; - - 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); - PyDictionary accum = new PyDictionary(); - addKeys(accum, "__dict__"); - ret.extend(accum.keys()); - ret.sort(); - return ret; + // Create an exception instance while we have a frame to create it from. When the GC runs it + // doesn't have any associated thread state. this is necessary for finalize calling close on + // the generator + generatorExit = Py.makeException(Py.GeneratorExit); } + @ExposedMethod public PyObject send(PyObject value) { if (gi_frame == null) { throw Py.StopIteration(""); @@ -45,26 +39,12 @@ return next(); } - private PyObject raiseException(PyException ex) { - if (gi_frame == null || gi_frame.f_lasti == 0) { - throw ex; - } - gi_frame.setGeneratorInput(ex); - return next(); - } - - public PyObject throw$(PyObject type) { - return raiseException(Py.makeException(type)); - } - - public PyObject throw$(PyObject type, PyObject value) { - return raiseException(Py.makeException(type, value)); - } - + @ExposedMethod(names="throw", defaults={"null", "null"}) public PyObject throw$(PyObject type, PyObject value, PyTraceback tb) { return raiseException(Py.makeException(type, value, tb)); } + @ExposedMethod public PyObject close() { try { raiseException(generatorExit); @@ -77,25 +57,43 @@ return Py.None; } + @Override + @ExposedMethod(doc="x.next() -> the next value, or raise StopIteration") + public PyObject next() { + return super.next(); + } + + @Override + @ExposedMethod + public PyObject __iter__() { + return this; + } + + private PyObject raiseException(PyException ex) { + if (gi_frame == null || gi_frame.f_lasti == 0) { + throw ex; + } + gi_frame.setGeneratorInput(ex); + return next(); + } + + @Override protected void finalize() throws Throwable { - if (gi_frame == null || gi_frame.f_lasti == -1) + if (gi_frame == null || gi_frame.f_lasti == -1) return; try { close(); } catch (PyException e) { // PEP 342 specifies that if an exception is raised by close, - // we output to stderr and then forget about it; + // we output to stderr and then forget about it; String className = PyException.exceptionClassName(e.type); int lastDot = className.lastIndexOf('.'); if (lastDot != -1) { className = className.substring(lastDot + 1); } - PyString m = Py.newString( - String.format("Exception %s: %s in %s", - className, - e.value.__repr__().toString(), - this.__repr__().toString())); - Py.println(Py.getSystemState().stderr, m); + String msg = String.format("Exception %s: %s in %s", className, e.value.__repr__() + .toString(), __repr__().toString()); + Py.println(Py.getSystemState().stderr, Py.newString(msg)); } catch (Throwable e) { // but we currently ignore any Java exception completely. perhaps we // can also output something meaningful too? @@ -110,7 +108,7 @@ if (gi_frame == null) { return null; } - + if (gi_frame.f_lasti == -1) { gi_frame = null; return null; Modified: trunk/jython/src/org/python/core/PyIterator.java =================================================================== --- trunk/jython/src/org/python/core/PyIterator.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/core/PyIterator.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -28,9 +28,8 @@ return this; } - public static PyString __doc__next = new PyString( - "x.next() -> the next value, or raise StopIteration" - ); + public static PyString __doc__next = + new PyString("x.next() -> the next value, or raise StopIteration"); /** * The exposed next method. Modified: trunk/jython/src/org/python/core/PyObject.java =================================================================== --- trunk/jython/src/org/python/core/PyObject.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/core/PyObject.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -3539,7 +3539,9 @@ } public void __set__(PyObject obj, PyObject value) { - throw Py.AttributeError("object internal __set__ impl is abstract"); + if (!_doset(obj, value)) { + throw Py.AttributeError("object internal __set__ impl is abstract"); + } } public void __delete__(PyObject obj) { Modified: trunk/jython/src/org/python/expose/ExposedMethod.java =================================================================== --- trunk/jython/src/org/python/expose/ExposedMethod.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/expose/ExposedMethod.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -7,24 +7,29 @@ /** * Indicates a method should be exposed to Python code. - * + * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ExposedMethod { /** - * @return the names to expose this method as. Defaults to just actual name of the method. + * Returns the names to expose this method as. Defaults to the name of the method. */ String[] names() default {}; /** - * @return default arguments. Starts at the number of arguments - defaults.length. + * Returns default arguments. Starts at the number of arguments - defaults.length. */ String[] defaults() default {}; /** - * @return - how to expose this method. See {@link MethodType} for the options. + * Returns how to expose this method. See {@link MethodType} for the options. */ MethodType type() default MethodType.DEFAULT; -} + + /** + * Returns the __doc__ String for this method. + */ + String doc() default ""; +} \ No newline at end of file Modified: trunk/jython/src/org/python/expose/generate/ClassMethodExposer.java =================================================================== --- trunk/jython/src/org/python/expose/generate/ClassMethodExposer.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/expose/generate/ClassMethodExposer.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -2,7 +2,6 @@ import org.python.objectweb.asm.Type; import org.python.core.PyBuiltinClassMethodNarrow; -import org.python.core.PyBuiltinMethodNarrow; public class ClassMethodExposer extends MethodExposer { @@ -14,7 +13,8 @@ String desc, String typeName, String[] asNames, - String[] defaults) { + String[] defaults, + String doc) { super(onType, methodName, getArgs(onType, methodName, desc), @@ -22,7 +22,8 @@ typeName, asNames, defaults, - PyBuiltinClassMethodNarrow.class); + PyBuiltinClassMethodNarrow.class, + doc); actualArgs = Type.getArgumentTypes(desc); } Modified: trunk/jython/src/org/python/expose/generate/ExposedMethodFinder.java =================================================================== --- trunk/jython/src/org/python/expose/generate/ExposedMethodFinder.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/expose/generate/ExposedMethodFinder.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -137,6 +137,15 @@ class ExposedMethodVisitor extends RestrictiveAnnotationVisitor { @Override + public void visit(String name, Object value) { + if (name.equals("doc")) { + doc = (String)value; + } else { + super.visit(name, value); + } + } + + @Override public AnnotationVisitor visitArray(String name) { if(name.equals("names")) { return new StringArrayBuilder() { @@ -173,6 +182,8 @@ private String[] defaults = new String[0]; private MethodType type = MethodType.DEFAULT; + + private String doc = ""; } @Override @@ -185,7 +196,8 @@ typeName, methVisitor.names, methVisitor.defaults, - methVisitor.type)); + methVisitor.type, + methVisitor.doc)); } if(newExp != null) { handleNewExposer(newExp); @@ -197,7 +209,8 @@ methodDesc, typeName, classMethVisitor.names, - classMethVisitor.defaults)); + classMethVisitor.defaults, + classMethVisitor.doc)); } super.visitEnd(); } Modified: trunk/jython/src/org/python/expose/generate/InstanceMethodExposer.java =================================================================== --- trunk/jython/src/org/python/expose/generate/InstanceMethodExposer.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/expose/generate/InstanceMethodExposer.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -27,7 +27,8 @@ typeName, new String[0], new String[0], - MethodType.DEFAULT); + MethodType.DEFAULT, + null); } public InstanceMethodExposer(Type onType, @@ -37,7 +38,8 @@ String typeName, String[] asNames, String[] defaults, - MethodType type) { + MethodType type, + String doc) { super(onType, methodName, Type.getArgumentTypes(desc), @@ -45,7 +47,8 @@ typeName, asNames, defaults, - isWide(desc) ? PyBuiltinMethod.class : PyBuiltinMethodNarrow.class); + isWide(desc) ? PyBuiltinMethod.class : PyBuiltinMethodNarrow.class, + doc); if ((access & ACC_STATIC) != 0) { throwInvalid("@ExposedMethod can't be applied to static methods"); } Modified: trunk/jython/src/org/python/expose/generate/MethodExposer.java =================================================================== --- trunk/jython/src/org/python/expose/generate/MethodExposer.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/src/org/python/expose/generate/MethodExposer.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -1,12 +1,11 @@ package org.python.expose.generate; import org.python.objectweb.asm.Type; -import org.python.expose.MethodType; public abstract class MethodExposer extends Exposer { protected String[] defaults; - + protected final String[] asNames; protected final String prefix, typeName; @@ -17,6 +16,8 @@ protected final Type onType, returnType; + protected final String doc; + public MethodExposer(Type onType, String methodName, Type[] args, @@ -24,12 +25,14 @@ String typeName, String[] asNames, String[] defaults, - Class superClass) { + Class superClass, + String doc) { super(superClass, onType.getClassName() + "$" + methodName + "_exposer"); this.onType = onType; this.methodName = methodName; this.args = args; this.typeName = typeName; + this.doc = doc; String prefix = typeName; int lastDot = prefix.lastIndexOf('.'); if (lastDot != -1) { @@ -64,7 +67,7 @@ } return asNames; } - + protected void generate() { generateNamedConstructor(); generateFullConstructor(); @@ -85,6 +88,12 @@ mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 3); superConstructor(PYTYPE, PYOBJ, BUILTIN_INFO); + mv.visitVarInsn(ALOAD, 0); + mv.visitLdcInsn(doc); + mv.visitFieldInsn(PUTFIELD, + BUILTIN_FUNCTION.getInternalName(), + "doc", + STRING.getDescriptor()); endConstructor(); } @@ -99,6 +108,12 @@ mv.visitLdcInsn(args.length + 1); superConstructor(STRING, INT, INT); } + mv.visitVarInsn(ALOAD, 0); + mv.visitLdcInsn(doc); + mv.visitFieldInsn(PUTFIELD, + BUILTIN_FUNCTION.getInternalName(), + "doc", + STRING.getDescriptor()); endConstructor(); } @@ -126,7 +141,7 @@ toPy(returnType); endMethod(ARETURN); } - + private boolean hasDefault(int argIndex) { return defaults.length - args.length + argIndex >= 0; } Modified: trunk/jython/tests/java/org/python/expose/generate/MethodExposerTest.java =================================================================== --- trunk/jython/tests/java/org/python/expose/generate/MethodExposerTest.java 2008-10-22 04:53:59 UTC (rev 5503) +++ trunk/jython/tests/java/org/python/expose/generate/MethodExposerTest.java 2008-10-22 08:27:42 UTC (rev 5504) @@ -6,7 +6,6 @@ import org.python.core.Py; import org.python.core.PyBuiltinCallable; import org.python.core.PyException; -import org.python.core.PyObject; import org.python.expose.MethodType; public class MethodExposerTest extends InterpTestCase implements Opcodes, PyTypes { @@ -167,7 +166,8 @@ "simpleexposed", new String[0], new String[] {"X"}, - MethodType.DEFAULT); + MethodType.DEFAULT, + ""); fail("Shouldn't be able to create the exposer with a default value"); } catch (InvalidExposingException ite) {} } @@ -197,7 +197,8 @@ new Type[] {PYTYPE}), "simpleexposed", new String[0], - new String[0]); + new String[0], + ""); PyBuiltinCallable bound = createBound(exp); assertEquals("a", bound.__call__().toString()); } @@ -212,7 +213,8 @@ PYOBJ}), "simpleexposed", new String[0], - new String[] {"null", "Py.None"}); + new String[] {"null", "Py.None"}, + ""); PyBuiltinCallable bound = createBound(exp); assertEquals(0, bound.__call__().asInt()); assertEquals(1, bound.__call__(Py.newString("hello")).asInt()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-25 23:03:44
|
Revision: 5508 http://jython.svn.sourceforge.net/jython/?rev=5508&view=rev Author: pjenvey Date: 2008-10-25 23:03:38 +0000 (Sat, 25 Oct 2008) Log Message: ----------- on SystemRestart: o shutdown all active sockets o hide InterruptedExceptions in threads for better SystemRestart support in PasteScript Modified Paths: -------------- trunk/jython/Lib/socket.py trunk/jython/Lib/threading.py trunk/jython/src/org/python/util/jython.java Modified: trunk/jython/Lib/socket.py =================================================================== --- trunk/jython/Lib/socket.py 2008-10-25 21:53:49 UTC (rev 5507) +++ trunk/jython/Lib/socket.py 2008-10-25 23:03:38 UTC (rev 5508) @@ -988,6 +988,16 @@ send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy __getattr__ = _dummy +_active_sockets = set() + +def _closeActiveSockets(): + for socket in _active_sockets.copy(): + try: + socket.close() + except error: + msg = 'Problem closing socket: %s: %r' % (socket, sys.exc_info()) + print >> sys.stderr, msg + class _socketobject(object): __doc__ = _realsocket.__doc__ @@ -1005,8 +1015,13 @@ meth = getattr(_sock, method, None) if meth: setattr(self, method, meth) + _active_sockets.add(self) def close(self): + try: + _active_sockets.remove(self) + except KeyError: + pass _sock = self._sock if isinstance(_sock, _nonblocking_api_mixin): _sock.close_lock.acquire() Modified: trunk/jython/Lib/threading.py =================================================================== --- trunk/jython/Lib/threading.py 2008-10-25 21:53:49 UTC (rev 5507) +++ trunk/jython/Lib/threading.py 2008-10-25 23:03:38 UTC (rev 5508) @@ -1,6 +1,8 @@ +from java.lang import InterruptedException from java.util import Collections, WeakHashMap from java.util.concurrent import Semaphore, CyclicBarrier from java.util.concurrent.locks import ReentrantLock +from org.python.util import jython from thread import _newFunctionThread from thread import _local as local import java.lang.Thread @@ -245,6 +247,11 @@ self.run() except SystemExit: pass + except InterruptedException: + # Quiet InterruptedExceptions if they're caused by + # _systemrestart + if not jython.shouldRestart: + raise except: # If sys.stderr is no more (most likely from interpreter # shutdown) use self.__stderr. Otherwise still use sys (as in Modified: trunk/jython/src/org/python/util/jython.java =================================================================== --- trunk/jython/src/org/python/util/jython.java 2008-10-25 21:53:49 UTC (rev 5507) +++ trunk/jython/src/org/python/util/jython.java 2008-10-25 23:03:38 UTC (rev 5508) @@ -63,7 +63,7 @@ "JYTHONPATH: '" + java.io.File.pathSeparator + "'-separated list of directories prefixed to the default module\n" + " search path. The result is sys.path."; - private static boolean shouldRestart; + public static boolean shouldRestart; public static void runJar(String filename) { // TBD: this is kind of gross because a local called `zipfile' just @@ -228,12 +228,12 @@ } catch(Throwable t) { if (t instanceof PyException && Py.matchException((PyException)t, _systemrestart.SystemRestart)) { - // Stop current threads... - thread.interruptAllThreads(); + // Shutdown this instance... + shouldRestart = true; + shutdownInterpreter(); // ..reset the state... Py.setSystemState(new PySystemState()); // ...and start again - shouldRestart = true; } else { Py.printException(t); if (!opts.interactive) { @@ -323,6 +323,21 @@ //System.err.println("imp"); return interp; } + + /** + * Run any finalizations on the current interpreter in preparation for a SytemRestart. + */ + public static void shutdownInterpreter() { + // Stop all the active threads + thread.interruptAllThreads(); + // Close all sockets -- not all of their operations are stopped by + // Thread.interrupt (in particular pre-nio sockets) + try { + imp.load("socket").__findattr__("_closeActiveSockets").__call__(); + } catch (PyException pye) { + // continue + } + } } class CommandLineOptions This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2008-10-26 22:13:10
|
Revision: 5514 http://jython.svn.sourceforge.net/jython/?rev=5514&view=rev Author: cgroves Date: 2008-10-26 22:13:05 +0000 (Sun, 26 Oct 2008) Log Message: ----------- Move Java Stream wrapping off into FileUtil so PyFile doesn't have to be exposed as the type file and as the PyJavaClass PyFile Modified Paths: -------------- trunk/jython/Lib/os.py trunk/jython/Lib/popen2.py trunk/jython/Lib/test/test_java_integration.py trunk/jython/Lib/test/test_javashell.py trunk/jython/src/org/python/core/Options.java trunk/jython/src/org/python/core/Py.java trunk/jython/src/org/python/core/PyFile.java trunk/jython/src/org/python/core/StdoutWrapper.java trunk/jython/src/org/python/core/io/FileDescriptors.java trunk/jython/src/org/python/core/util/FileUtil.java Modified: trunk/jython/Lib/os.py =================================================================== --- trunk/jython/Lib/os.py 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/Lib/os.py 2008-10-26 22:13:05 UTC (rev 5514) @@ -46,7 +46,6 @@ import stat as _stat import sys from java.io import File -from org.python.core import PyFile from org.python.core.io import FileDescriptors, FileIO, IOBase from org.python.core.Py import newString as asPyString @@ -554,7 +553,7 @@ raise OSError(errno.EBADF, errno.strerror(errno.EBADF)) try: - fp = PyFile(rawio, '<fdopen>', mode, bufsize) + fp = FileDescriptors.wrap(rawio, mode, bufsize) except IOError: raise OSError(errno.EINVAL, errno.strerror(errno.EINVAL)) return fp Modified: trunk/jython/Lib/popen2.py =================================================================== --- trunk/jython/Lib/popen2.py 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/Lib/popen2.py 2008-10-26 22:13:05 UTC (rev 5514) @@ -27,9 +27,10 @@ from java.io import BufferedInputStream from java.io import PipedOutputStream from java.io import PipedInputStream -from org.python.core import PyFile from javashell import shellexecute +from org.python.core.util import FileUtil + __all__ = ["popen", "popen2", "popen3", "popen4", "Popen3", "Popen4"] _active = [] @@ -43,7 +44,7 @@ the close method. """ def __init__(self, stream, process, name): - self._file = PyFile(stream, "'%s'" % name) + self._file = FileUtil.wrap(stream) self._process = process def __getattr__(self, name): @@ -92,10 +93,10 @@ bufsize ) - self.tochild = PyFile( self._tochild ) - self.fromchild = PyFile( self._fromchild ) + self.tochild = FileUtil.wrap(self._tochild) + self.fromchild = FileUtil.wrap(self._fromchild) if self._childerr: - self.childerr = PyFile( self._childerr ) + self.childerr = FileUtil.wrap(self._childerr) def _startChildWaiter(self): """Start a subthread that waits for the child process to exit.""" @@ -197,7 +198,7 @@ "%s-stderr" % self.process, self._close ) - return PyFile( joinedStream ) + return FileUtil.wrap(joinedStream) def _close( self ): """Must be closed twice (once for each of the two joined pipes)""" Modified: trunk/jython/Lib/test/test_java_integration.py =================================================================== --- trunk/jython/Lib/test/test_java_integration.py 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/Lib/test/test_java_integration.py 2008-10-26 22:13:05 UTC (rev 5514) @@ -155,7 +155,8 @@ self.assertRaises(FileNotFoundException, FileInputStream, "garbage") def test_unsupported(self): - fp = open(System.out) + from org.python.core.util import FileUtil + fp = FileUtil.wrap(System.out) self.assertRaises(IOError, fp.tell) class VectorTest(unittest.TestCase): Modified: trunk/jython/Lib/test/test_javashell.py =================================================================== --- trunk/jython/Lib/test/test_javashell.py 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/Lib/test/test_javashell.py 2008-10-26 22:13:05 UTC (rev 5514) @@ -1,11 +1,11 @@ import unittest from test import test_support -from org.python.core import PyFile import re import os import javashell +from org.python.core.util import FileUtil # testCmds is a list of (command, expectedOutput) # each command is executed twice, once in unitialized environment and @@ -73,7 +73,7 @@ for cmd, pattern in testCmds: dprint( "\nExecuting '%s' with %s environment" % (cmd, whichEnv)) p = javashell.shellexecute(cmd) - line = PyFile( p.getInputStream() ).readlines()[0] + line = FileUtil.wrap(p.getInputStream()).readlines()[0] assert re.match( pattern, line ), \ "expected match for %s, got %s" % ( pattern, line ) dprint( "waiting for", cmd, "to complete") Modified: trunk/jython/src/org/python/core/Options.java =================================================================== --- trunk/jython/src/org/python/core/Options.java 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/src/org/python/core/Options.java 2008-10-26 22:13:05 UTC (rev 5514) @@ -22,7 +22,7 @@ * considerably. */ public static boolean includeJavaStackInExceptions = false; - + /** * When true, python exception raised in overriden methods will be shown on * stderr. This option is remarkably useful when python is used for @@ -123,7 +123,7 @@ // Set the more unusual options Options.showJavaExceptions = getBooleanOption( "options.showJavaExceptions", Options.showJavaExceptions); - + Options.includeJavaStackInExceptions = getBooleanOption( "options.includeJavaStackInExceptions", Options.includeJavaStackInExceptions); Modified: trunk/jython/src/org/python/core/Py.java =================================================================== --- trunk/jython/src/org/python/core/Py.java 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/src/org/python/core/Py.java 2008-10-26 22:13:05 UTC (rev 5514) @@ -455,13 +455,13 @@ @param o the <code>PyObject</code> to convert. @param c the class to convert it to. **/ - public static Object tojava(PyObject o, Class c) { + public static <T> T tojava(PyObject o, Class<T> c) { Object obj = o.__tojava__(c); if (obj == Py.NoConversion) { throw Py.TypeError("can't convert " + o.__repr__() + " to " + c.getName()); } - return obj; + return (T)obj; } // ??pending: was @deprecated but is actually used by proxie code. @@ -1963,7 +1963,7 @@ if (file instanceof PyJavaInstance) { Object tojava = file.__tojava__(OutputStream.class); if (tojava != null && tojava != Py.NoConversion) { - this.file = new PyFile((OutputStream) tojava, "<java OutputStream>"); + this.file = new PyFile((OutputStream) tojava); } } } Modified: trunk/jython/src/org/python/core/PyFile.java =================================================================== --- trunk/jython/src/org/python/core/PyFile.java 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/src/org/python/core/PyFile.java 2008-10-26 22:13:05 UTC (rev 5514) @@ -3,7 +3,6 @@ import java.io.InputStream; import java.io.OutputStream; -import java.io.RandomAccessFile; import java.util.LinkedList; import org.python.core.io.BinaryIOWrapper; @@ -20,13 +19,13 @@ import org.python.core.io.TextIOBase; import org.python.core.io.TextIOWrapper; import org.python.core.io.UniversalIOWrapper; +import org.python.core.util.FileUtil; import org.python.expose.ExposedDelete; import org.python.expose.ExposedGet; import org.python.expose.ExposedMethod; import org.python.expose.ExposedNew; import org.python.expose.ExposedSet; import org.python.expose.ExposedType; -import org.python.expose.MethodType; /** * A python file wrapper around a java stream, reader/writer or file. @@ -35,7 +34,7 @@ public class PyFile extends PyObject { public static final PyType TYPE = PyType.fromClass(PyFile.class); - + /** The filename */ @ExposedGet public PyObject name; @@ -75,14 +74,13 @@ private Closer closer; /** All PyFiles' closers */ - private static LinkedList closers = new LinkedList(); + private static LinkedList<Closer> closers = new LinkedList<Closer>(); static { initCloser(); } - public PyFile() { - } + public PyFile() {} public PyFile(PyType subType) { super(subType); @@ -93,100 +91,41 @@ file___init__(raw, name, mode, bufsize); } - public PyFile(InputStream istream, String name, String mode, int bufsize, - boolean closefd) { + PyFile(InputStream istream, String name, String mode, int bufsize, boolean closefd) { parseMode(mode); file___init__(new StreamIO(istream, closefd), name, mode, bufsize); } - public PyFile(InputStream istream, String name, String mode, int bufsize) { - this(istream, name, mode, -1, true); - } - - public PyFile(InputStream istream, String name, String mode) { - this(istream, name, mode, -1); - } - - public PyFile(InputStream istream, String name) { - this(istream, name, "r"); - } - + /** + * Creates a file object wrapping the given <code>InputStream</code>. The builtin methods + * <code>file</code> and <code>open</code> don't expose this functionality as it isn't available + * to regular Python code. To wrap an InputStream in a file from Python, use + * {@link FileUtil#wrap(InputStream)} + */ public PyFile(InputStream istream) { - this(istream, "<???>", "r"); + this(istream, "<Java InputStream '" + istream + "' as file>", "r", -1, true); } - public PyFile(OutputStream ostream, String name, String mode, int bufsize, boolean closefd) { + PyFile(OutputStream ostream, String name, String mode, int bufsize, boolean closefd) { parseMode(mode); file___init__(new StreamIO(ostream, closefd), name, mode, bufsize); } - public PyFile(OutputStream ostream, String name, String mode, int bufsize) { - this(ostream, name, mode, -1, true); - } - - public PyFile(OutputStream ostream, String name, String mode) { - this(ostream, name, mode, -1); - } - - public PyFile(OutputStream ostream, String name) { - this(ostream, name, "w"); - } - + /** + * Creates a file object wrapping the given <code>OutputStream</code>. The builtin methods + * <code>file</code> and <code>open</code> don't expose this functionality as it isn't available + * to regular Python code. To wrap an OutputStream in a file from Python, use + * {@link FileUtil#wrap(OutputStream)} + */ public PyFile(OutputStream ostream) { - this(ostream, "<???>", "w"); + this(ostream, "<Java OutputStream '" + ostream + "' as file>", "w", -1, true); } - public PyFile(RandomAccessFile file, String name, String mode, int bufsize) { - file___init__(new FileIO(file.getChannel(), parseMode(mode)), name, mode, bufsize); - } - - public PyFile(RandomAccessFile file, String name, String mode) { - this(file, name, mode, -1); - } - - public PyFile(RandomAccessFile file, String name) { - this(file, name, "r+"); - } - - public PyFile(RandomAccessFile file) { - this(file, "<???>", "r+"); - } - public PyFile(String name, String mode, int bufsize) { file___init__(new FileIO(name, parseMode(mode)), name, mode, bufsize); } @ExposedNew - static final PyObject file_new(PyNewWrapper new_, boolean init, PyType subtype, - PyObject[] args, String[] keywords) { - PyFile newFile; - if (new_.for_type == subtype) { - if (init) { - if (args.length - keywords.length == 0) { - newFile = new PyFile(); - newFile.file___init__(args, keywords); - } else if (args[0] instanceof PyString || - (args[0] instanceof PyJavaInstance && - ((PyJavaInstance)args[0]).javaProxy == String.class)) { - // If first arg is a PyString or String, assume - // its being called as a builtin. - newFile = new PyFile(); - newFile.file___init__(args, keywords); - newFile.closer = new Closer(newFile.file); - } else { - // assume it's being called as a java class - PyJavaClass pjc = new PyJavaClass(PyFile.class); - newFile = (PyFile)pjc.__call__(args, keywords); - } - } else { - newFile = new PyFile(); - } - } else { - newFile = new PyFileDerived(subtype); - } - return newFile; - } - @ExposedMethod final void file___init__(PyObject[] args, String[] kwds) { ArgParser ap = new ArgParser("file", args, kwds, new String[] {"name", "mode", "bufsize"}, @@ -199,6 +138,7 @@ String mode = ap.getString(1, "r"); int bufsize = ap.getInt(2, -1); file___init__(new FileIO(name.toString(), parseMode(mode)), name, mode, bufsize); + closer = new Closer(file); } private void file___init__(RawIOBase raw, String name, String mode, int bufsize) { @@ -613,18 +553,15 @@ } /** - * A mechanism to make sure PyFiles are closed on exit. On - * creation Closer adds itself to a list of Closers that will be - * run by PyFileCloser on JVM shutdown. When a PyFile's close or - * finalize methods are called, PyFile calls its Closer.close - * which clears Closer out of the shutdown queue. + * A mechanism to make sure PyFiles are closed on exit. On creation Closer adds itself to a list + * of Closers that will be run by PyFileCloser on JVM shutdown. When a PyFile's close or + * finalize methods are called, PyFile calls its Closer.close which clears Closer out of the + * shutdown queue. * - * We use a regular object here rather than WeakReferences and - * their ilk as they may be collected before the shutdown hook - * runs. There's no guarantee that finalize will be called during - * shutdown, so we can't use it. It's vital that this Closer has - * no reference to the PyFile it's closing so the PyFile remains - * garbage collectable. + * We use a regular object here rather than WeakReferences and their ilk as they may be + * collected before the shutdown hook runs. There's no guarantee that finalize will be called + * during shutdown, so we can't use it. It's vital that this Closer has no reference to the + * PyFile it's closing so the PyFile remains garbage collectable. */ private static class Closer { @@ -667,7 +604,7 @@ synchronized (closers) { while (closers.size() > 0) { try { - ((Closer)closers.removeFirst()).doClose(); + closers.removeFirst().doClose(); } catch (PyException e) { // continue } Modified: trunk/jython/src/org/python/core/StdoutWrapper.java =================================================================== --- trunk/jython/src/org/python/core/StdoutWrapper.java 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/src/org/python/core/StdoutWrapper.java 2008-10-26 22:13:05 UTC (rev 5514) @@ -31,7 +31,7 @@ Object tojava = obj.__tojava__(OutputStream.class); if (tojava != null && tojava != Py.NoConversion) { - f = new PyFile((OutputStream)tojava, "<java OutputStream>"); + f = new PyFile((OutputStream)tojava); } if (f != null) { setObject(ss, f); Modified: trunk/jython/src/org/python/core/io/FileDescriptors.java =================================================================== --- trunk/jython/src/org/python/core/io/FileDescriptors.java 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/src/org/python/core/io/FileDescriptors.java 2008-10-26 22:13:05 UTC (rev 5514) @@ -2,7 +2,7 @@ package org.python.core.io; import org.python.core.Py; -import org.python.core.PyJavaInstance; +import org.python.core.PyFile; import org.python.core.PyObject; /** @@ -14,22 +14,20 @@ */ public class FileDescriptors { + public static PyFile wrap(RawIOBase raw, String mode, int bufsize) { + return new PyFile(raw, "<fdopen>", mode, bufsize); + } + /** - * Return the RawIOBase associated with the specified file - * descriptor. + * Return the RawIOBase associated with the specified file descriptor. * * Raises a Python exception is the file descriptor is invalid * - * @param fd a Jython file descriptor object + * @param fd + * a Jython file descriptor object * @return the RawIOBase associated with the file descriptor */ public static RawIOBase get(PyObject fd) { - if (fd instanceof PyJavaInstance) { - Object tojava = ((PyJavaInstance)fd).__tojava__(RawIOBase.class); - if (tojava instanceof RawIOBase) { - return (RawIOBase)tojava; - } - } - throw Py.TypeError("a fileno is required"); + return Py.tojava(fd, RawIOBase.class); } } Modified: trunk/jython/src/org/python/core/util/FileUtil.java =================================================================== --- trunk/jython/src/org/python/core/util/FileUtil.java 2008-10-26 21:13:51 UTC (rev 5513) +++ trunk/jython/src/org/python/core/util/FileUtil.java 2008-10-26 22:13:05 UTC (rev 5514) @@ -2,14 +2,32 @@ package org.python.core.util; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; -import java.io.IOException; +import java.io.OutputStream; +import org.python.core.PyFile; + /** * Utility methods for Java file handling. */ public class FileUtil { + /** + * Creates a PyFile that reads from the given <code>InputStream</code>. + */ + public static PyFile wrap(InputStream is) { + return new PyFile(is); + } + + /** + * Creates a PyFile that writes to the given <code>OutputStream</code>. + */ + public static PyFile wrap(OutputStream os) { + return new PyFile(os); + } + + /** * Read all bytes from the input stream. <p/> Note that using this method to * read very large streams could cause out-of-memory exceptions and/or block * for large periods of time. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2008-10-28 07:58:52
|
Revision: 5523 http://jython.svn.sourceforge.net/jython/?rev=5523&view=rev Author: cgroves Date: 2008-10-28 07:58:42 +0000 (Tue, 28 Oct 2008) Log Message: ----------- Make Java static inner classes visible from Java subclasses. From garyh's patch. Resolves issue 1147. Modified Paths: -------------- trunk/jython/Lib/test/test_java_visibility.py trunk/jython/src/org/python/core/Py.java trunk/jython/src/org/python/core/PyJavaClass.java trunk/jython/tests/java/org/python/tests/Visible.java Modified: trunk/jython/Lib/test/test_java_visibility.py =================================================================== --- trunk/jython/Lib/test/test_java_visibility.py 2008-10-27 21:15:22 UTC (rev 5522) +++ trunk/jython/Lib/test/test_java_visibility.py 2008-10-28 07:58:42 UTC (rev 5523) @@ -14,7 +14,7 @@ Visible.__init__(self, publicValue) else: Visible.__init__(self) - # TODO - protectedStaticMethod, protectedStaticField, and protectedField should + # TODO - protectedStaticMethod, protectedStaticField, StaticInner, and protectedField should # be here s = SubVisible() self.assertEquals(Results.PROTECTED_METHOD, s.protectedMethod(0)) @@ -37,6 +37,7 @@ v.visibleStatic('a')) self.assertEquals(Results.EXTRA_ARG_PUBLIC_STATIC_METHOD, v.visibleStatic(0, 'a')) + self.assertEquals(Results.PUBLIC_STATIC_FIELD, Visible.StaticInner.visibleStaticField) # Ensure that the visibleInstance method from SubVisible that takes a double doesn't # leak through to the parent @@ -57,7 +58,9 @@ # Java methods don't allow direct calling of the superclass method, so it should # return the subclass value here. self.assertEquals(Results.SUBCLASS_OVERRIDE, Visible.visibleInstance(s, 3)) + self.assertEquals(Results.PUBLIC_STATIC_FIELD, SubVisible.StaticInner.visibleStaticField) + def test_in_dict(self): for c in Visible, SubVisible, VisibleOverride: self.failUnless('visibleInstance' in c.__dict__, Modified: trunk/jython/src/org/python/core/Py.java =================================================================== --- trunk/jython/src/org/python/core/Py.java 2008-10-27 21:15:22 UTC (rev 5522) +++ trunk/jython/src/org/python/core/Py.java 2008-10-28 07:58:42 UTC (rev 5523) @@ -762,20 +762,6 @@ return true; } - public static Class relFindClass(Class home, String name) { - try { - ClassLoader loader = home.getClassLoader(); - if (loader != null) { - return loader.loadClass(name); - } else { - return Class.forName(name); - } - } catch (ClassNotFoundException exc) { - return null; - } catch (Throwable t) { - throw Py.JavaError(t); - } - } private static boolean secEnv = false; public static Class findClass(String name) { Modified: trunk/jython/src/org/python/core/PyJavaClass.java =================================================================== --- trunk/jython/src/org/python/core/PyJavaClass.java 2008-10-27 21:15:22 UTC (rev 5522) +++ trunk/jython/src/org/python/core/PyJavaClass.java 2008-10-28 07:58:42 UTC (rev 5523) @@ -709,10 +709,16 @@ } private PyObject findInnerClass(String name) { - Class p = getProxyClass(); - Class innerClass = Py.relFindClass(p, p.getName() + "$" + name); - if (innerClass == null) + Class<?> innerClass = null; + for (Class<?> inner : getProxyClass().getClasses()) { + if(inner.getSimpleName().equals(name)) { + innerClass = inner; + break; + } + } + if (innerClass == null) { return null; + } PyObject jinner = Py.java2py(innerClass); // xxx lookup(innerClass); __dict__.__setitem__(name, jinner); return jinner; Modified: trunk/jython/tests/java/org/python/tests/Visible.java =================================================================== --- trunk/jython/tests/java/org/python/tests/Visible.java 2008-10-27 21:15:22 UTC (rev 5522) +++ trunk/jython/tests/java/org/python/tests/Visible.java 2008-10-28 07:58:42 UTC (rev 5523) @@ -12,6 +12,11 @@ public static int visibleStatic = PUBLIC_STATIC_METHOD_FIELD; + public static class StaticInner { + + public static int visibleStaticField = PUBLIC_STATIC_FIELD; + } + public Visible() { this(PUBLIC_FIELD); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-28 21:51:11
|
Revision: 5524 http://jython.svn.sourceforge.net/jython/?rev=5524&view=rev Author: pjenvey Date: 2008-10-28 21:47:35 +0000 (Tue, 28 Oct 2008) Log Message: ----------- fix float and complex's __pow__ not being exposed as binary ops Modified Paths: -------------- trunk/jython/Lib/test/test_complex_jy.py trunk/jython/Lib/test/test_float_jy.py trunk/jython/src/org/python/core/PyComplex.java trunk/jython/src/org/python/core/PyFloat.java Modified: trunk/jython/Lib/test/test_complex_jy.py =================================================================== --- trunk/jython/Lib/test/test_complex_jy.py 2008-10-28 07:58:42 UTC (rev 5523) +++ trunk/jython/Lib/test/test_complex_jy.py 2008-10-28 21:47:35 UTC (rev 5524) @@ -11,7 +11,14 @@ self.assertEqual(complex.__coerce__(1+1j, None), NotImplemented) self.assertRaises(TypeError, complex.__coerce__, None, 1+2j) + def test_pow(self): + class Foo(object): + def __rpow__(self, other): + return other ** 2 + # regression in 2.5 alphas + self.assertEqual((4+0j) ** Foo(), (16+0j)) + def test_main(): test_support.run_unittest(ComplexTest) Modified: trunk/jython/Lib/test/test_float_jy.py =================================================================== --- trunk/jython/Lib/test/test_float_jy.py 2008-10-28 07:58:42 UTC (rev 5523) +++ trunk/jython/Lib/test/test_float_jy.py 2008-10-28 21:47:35 UTC (rev 5524) @@ -78,7 +78,14 @@ def test_float_none(self): self.assertRaises(TypeError, float, None) + def test_pow(self): + class Foo(object): + def __rpow__(self, other): + return other ** 2 + # regression in 2.5 alphas + self.assertEqual(4.0 ** Foo(), 16.0) + def test_main(): test_support.run_unittest(FloatTestCase) Modified: trunk/jython/src/org/python/core/PyComplex.java =================================================================== --- trunk/jython/src/org/python/core/PyComplex.java 2008-10-28 07:58:42 UTC (rev 5523) +++ trunk/jython/src/org/python/core/PyComplex.java 2008-10-28 21:47:35 UTC (rev 5524) @@ -569,7 +569,7 @@ return complex___pow__(right, modulo); } - @ExposedMethod(defaults = "null") + @ExposedMethod(type = MethodType.BINARY, defaults = "null") final PyObject complex___pow__(PyObject right, PyObject modulo) { if (modulo != null) { throw Py.ValueError("complex modulo"); Modified: trunk/jython/src/org/python/core/PyFloat.java =================================================================== --- trunk/jython/src/org/python/core/PyFloat.java 2008-10-28 07:58:42 UTC (rev 5523) +++ trunk/jython/src/org/python/core/PyFloat.java 2008-10-28 21:47:35 UTC (rev 5524) @@ -468,7 +468,7 @@ return float___pow__(right, modulo); } - @ExposedMethod(defaults = "null") + @ExposedMethod(type = MethodType.BINARY, defaults = "null") final PyObject float___pow__(PyObject right, PyObject modulo) { if (!canCoerce(right)) return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-29 02:39:05
|
Revision: 5525 http://jython.svn.sourceforge.net/jython/?rev=5525&view=rev Author: pjenvey Date: 2008-10-29 02:38:55 +0000 (Wed, 29 Oct 2008) Log Message: ----------- o fix assert not nan == nan and nan != nan, and cmp on nans o fix math.frexp(nan) causing an endless loop Modified Paths: -------------- trunk/jython/Lib/test/test_float_jy.py trunk/jython/src/org/python/core/PyFloat.java trunk/jython/src/org/python/modules/math.java Added Paths: ----------- trunk/jython/Lib/test/test_math_jy.py Modified: trunk/jython/Lib/test/test_float_jy.py =================================================================== --- trunk/jython/Lib/test/test_float_jy.py 2008-10-28 21:47:35 UTC (rev 5524) +++ trunk/jython/Lib/test/test_float_jy.py 2008-10-29 02:38:55 UTC (rev 5525) @@ -66,10 +66,23 @@ self.assertNotEqual(0.1, shuge_int) def test_nan(self): - self.assert_(type(float('NaN')), float) - self.assert_(type(float('nan')), float) - self.assertEqual(long(float('NaN')), 0) + nan = float('nan') + self.assert_(type(nan), float) + if jython: + # support Java syntax + self.assert_(type(float('NaN')), float) + # CPython 2.4/2.5 allow this + self.assertEqual(long(nan), 0) + + self.assertNotEqual(nan, float('nan')) + self.assertNotEqual(nan, nan) + self.assertEqual(cmp(nan, float('nan')), 1) + self.assertEqual(cmp(nan, nan), 0) + for i in (-1, 1, -1.0, 1.0): + self.assertEqual(cmp(nan, i), -1) + self.assertEqual(cmp(i, nan), 1) + def test_infinity(self): self.assert_(type(float('Infinity')), float) self.assert_(type(float('inf')), float) Added: trunk/jython/Lib/test/test_math_jy.py =================================================================== --- trunk/jython/Lib/test/test_math_jy.py (rev 0) +++ trunk/jython/Lib/test/test_math_jy.py 2008-10-29 02:38:55 UTC (rev 5525) @@ -0,0 +1,26 @@ +"""Misc math module tests + +Made for Jython. +""" +import math +import unittest +from test import test_support + +inf = float('inf') +nan = float('nan') + +class MathTestCase(unittest.TestCase): + + def test_frexp(self): + self.assertEqual(math.frexp(inf), (inf, 0)) + mantissa, exponent = math.frexp(nan) + self.assertNotEqual(mantissa, mantissa) + self.assertEqual(exponent, 0) + + +def test_main(): + test_support.run_unittest(MathTestCase) + + +if __name__ == '__main__': + test_main() Modified: trunk/jython/src/org/python/core/PyFloat.java =================================================================== --- trunk/jython/src/org/python/core/PyFloat.java 2008-10-28 21:47:35 UTC (rev 5524) +++ trunk/jython/src/org/python/core/PyFloat.java 2008-10-29 02:38:55 UTC (rev 5525) @@ -168,6 +168,22 @@ return super.__tojava__(c); } + public PyObject __eq__(PyObject other) { + // preclude _cmp_unsafe's this == other shortcut because NaN != anything, even + // itself + if (Double.isNaN(value)) { + return Py.False; + } + return null; + } + + public PyObject __ne__(PyObject other) { + if (Double.isNaN(value)) { + return Py.True; + } + return null; + } + public int __cmp__(PyObject other) { return float___cmp__(other); } @@ -197,7 +213,17 @@ } else { return -2; } - return i < j ? -1 : i > j ? 1 : 0; + + if (i < j) { + return -1; + } else if (i > j) { + return 1; + } else if (i == j) { + return 0; + } else { + // at least one side is NaN + return Double.isNaN(i) ? (Double.isNaN(j) ? 1 : -1) : 1; + } } public Object __coerce_ex__(PyObject other) { Modified: trunk/jython/src/org/python/modules/math.java =================================================================== --- trunk/jython/src/org/python/modules/math.java 2008-10-28 21:47:35 UTC (rev 5524) +++ trunk/jython/src/org/python/modules/math.java 2008-10-29 02:38:55 UTC (rev 5525) @@ -157,26 +157,26 @@ return new PyTuple(new PyFloat(w), new PyFloat(v)); } - public static PyTuple frexp(double v) { - int i = 0; - if (v != 0.0) { - int sign = 1; - if (v < 0) { + public static PyTuple frexp(double x) { + int exponent = 0; + + if (Double.isNaN(x) || Double.isInfinite(x) || x == 0.0) { + exponent = 0; + } else { + short sign = 1; + + if (x < 0.0) { + x = -x; sign = -1; - v = -v; } - // slow... - while (v < 0.5) { - v = v*2.0; - i = i-1; - } - while (v >= 1.0) { - v = v*0.5; - i = i+1; - } - v = v*sign; + + for (; x < 0.5; x *= 2.0, exponent--); + + for (; x >= 1.0; x *= 0.5, exponent++); + + x *= sign; } - return new PyTuple(new PyFloat(v), new PyInteger(i)); + return new PyTuple(new PyFloat(x), new PyInteger(exponent)); } public static double ldexp(double v, int w) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-30 03:05:36
|
Revision: 5528 http://jython.svn.sourceforge.net/jython/?rev=5528&view=rev Author: pjenvey Date: 2008-10-30 03:05:31 +0000 (Thu, 30 Oct 2008) Log Message: ----------- o make asInt try conversion via custom __int__ methods on non int/longs, as these are valid asInts in most places (like ArgParser.getInt, xrange) o make range use asInt with non long args, which is trickier than it sounds, so rewrote it to work exactly as CPython's -- bonus of being faster for int args Modified Paths: -------------- trunk/jython/Lib/test/test_builtin_jy.py trunk/jython/src/org/python/core/PyObject.java trunk/jython/src/org/python/core/PyString.java trunk/jython/src/org/python/core/PyXRange.java trunk/jython/src/org/python/core/__builtin__.java Modified: trunk/jython/Lib/test/test_builtin_jy.py =================================================================== --- trunk/jython/Lib/test/test_builtin_jy.py 2008-10-30 02:49:44 UTC (rev 5527) +++ trunk/jython/Lib/test/test_builtin_jy.py 2008-10-30 03:05:31 UTC (rev 5528) @@ -102,6 +102,19 @@ return None self.assert_(not callable(Baz())) +class RangeTest(unittest.TestCase): + + class Foo(object): + def __int__(self): + return 3 + foo = Foo() + + def test_range_non_int(self): + self.assertEqual(range(self.foo), [0, 1, 2]) + + def test_xrange_non_int(self): + self.assertEqual(list(xrange(self.foo)), [0, 1, 2]) + def test_main(): test.test_support.run_unittest(BuiltinTest, LoopTest, @@ -110,7 +123,8 @@ ChrTest, ReturnTest, ReprTest, - CallableTest) + CallableTest, + RangeTest) if __name__ == "__main__": test_main() Modified: trunk/jython/src/org/python/core/PyObject.java =================================================================== --- trunk/jython/src/org/python/core/PyObject.java 2008-10-30 02:49:44 UTC (rev 5527) +++ trunk/jython/src/org/python/core/PyObject.java 2008-10-30 03:05:31 UTC (rev 5528) @@ -3866,7 +3866,20 @@ } public int asInt() { - throw Py.TypeError("an integer is required"); + PyObject intObj; + try { + intObj = __int__(); + } catch (PyException pye) { + if (Py.matchException(pye, Py.AttributeError)) { + throw Py.TypeError("an integer is required"); + } + throw pye; + } + if (!(intObj instanceof PyInteger) && !(intObj instanceof PyLong)) { + // Shouldn't happen except with buggy builtin types + throw Py.TypeError("nb_int should return int object"); + } + return intObj.asInt(); } public long asLong(int index) throws ConversionException { Modified: trunk/jython/src/org/python/core/PyString.java =================================================================== --- trunk/jython/src/org/python/core/PyString.java 2008-10-30 02:49:44 UTC (rev 5527) +++ trunk/jython/src/org/python/core/PyString.java 2008-10-30 03:05:31 UTC (rev 5528) @@ -2400,6 +2400,17 @@ return string; } + @Override + public int asInt() { + // We have to override asInt because we override __int__, but generally don't want + // implicit atoi conversions for the base types. blah + PyType type = getType(); + if (type == PyString.TYPE || type == PyUnicode.TYPE || type.lookup("__int__") == null) { + throw Py.TypeError("an integer is required"); + } + return super.asInt(); + } + public String asName(int index) throws PyObject.ConversionException { return internedString(); } Modified: trunk/jython/src/org/python/core/PyXRange.java =================================================================== --- trunk/jython/src/org/python/core/PyXRange.java 2008-10-30 02:49:44 UTC (rev 5527) +++ trunk/jython/src/org/python/core/PyXRange.java 2008-10-30 03:05:31 UTC (rev 5528) @@ -77,7 +77,7 @@ * @param step int value (> 0) * @return int length of range */ - private int getLenOfRange(int lo, int hi, int step) { + static int getLenOfRange(int lo, int hi, int step) { int n = 0; if (lo < hi) { // the base difference may be > Integer.MAX_VALUE Modified: trunk/jython/src/org/python/core/__builtin__.java =================================================================== --- trunk/jython/src/org/python/core/__builtin__.java 2008-10-30 02:49:44 UTC (rev 5527) +++ trunk/jython/src/org/python/core/__builtin__.java 2008-10-30 03:05:31 UTC (rev 5528) @@ -989,48 +989,36 @@ } public static PyObject range(PyObject start, PyObject stop, PyObject step) { - // Check that step is valid. - int stepCmp = step.__cmp__(Py.Zero); - if (stepCmp == -2) { - throw Py.TypeError("non-integer type for step in range()"); - } else if (stepCmp == 0) { - throw Py.ValueError("zero step for range()"); + int ilow = 0; + int ihigh = 0; + int istep = 1; + int n; + + try { + ilow = start.asInt(); + ihigh = stop.asInt(); + istep = step.asInt(); + } catch (PyException pye) { + return handleRangeLongs(start, stop, step); } - // Calculate the number of values in the range. - PyObject n = stop.__sub__(start); - if (n == null) { - throw Py.TypeError("non-integer type for start or stop in range()"); + if (istep == 0) { + throw Py.ValueError("range() step argument must not be zero"); } - n = n.__add__(step); - if (stepCmp == 1) { // step is positive - n = n.__sub__(Py.One).__div__(step); - } else { // step is negative - n = n.__add__(Py.One).__div__(step); + if (istep > 0) { + n = PyXRange.getLenOfRange(ilow, ihigh, istep); + } else { + n = PyXRange.getLenOfRange(ihigh, ilow, -istep); } - - // Check that the number of values is valid. - if (n.__cmp__(Py.Zero) <= 0) { - return new PyList(); + if (n < 0) { + throw Py.OverflowError("range() result has too many items"); } - Object nAsInteger = n.__tojava__(Integer.TYPE); - if (nAsInteger == Py.NoConversion) { - if (n instanceof PyLong) { - throw Py.OverflowError("Can't use range for more than " + Integer.MAX_VALUE + " items. Try xrange instead."); - } else { - throw Py.TypeError("non-integer type for start or stop in range()"); - } - } - // Fill in the range. - int nAsInt = ((Integer) nAsInteger).intValue(); - PyObject j = start; - PyObject[] objs = new PyObject[nAsInt]; - for (int i = 0; i < nAsInt; i++) { - objs[i] = j; - j = j.__add__(step); + PyObject[] range = new PyObject[n]; + for (int i = 0; i < n; i++, ilow += istep) { + range[i] = Py.newInteger(ilow); } - return new PyList(objs); + return new PyList(range); } public static PyObject range(PyObject n) { @@ -1041,6 +1029,70 @@ return range(start, stop, Py.One); } + /** + * Handle range() when PyLong arguments (that OverFlow ints) are given. + */ + private static PyObject handleRangeLongs(PyObject ilow, PyObject ihigh, PyObject istep) { + if (!(ilow instanceof PyInteger) && !(ilow instanceof PyLong)) { + throw Py.TypeError(String.format("range() integer start argument expected, got %s.", + ilow.getType().fastGetName())); + } + if (!(ihigh instanceof PyInteger) && !(ihigh instanceof PyLong)) { + throw Py.TypeError(String.format("range() integer end argument expected, got %s.", + ihigh.getType().fastGetName())); + } + if (!(istep instanceof PyInteger) && !(istep instanceof PyLong)) { + throw Py.TypeError(String.format("range() integer step argument expected, got %s.", + istep.getType().fastGetName())); + } + + int n; + int cmpResult = istep._cmp(Py.Zero); + if (cmpResult == 0) { + throw Py.ValueError("range() step argument must not be zero"); + } + if (cmpResult > 0) { + n = getLenOfRangeLongs(ilow, ihigh, istep); + } else { + n = getLenOfRangeLongs(ihigh, ilow, istep.__neg__()); + } + if (n < 0) { + throw Py.OverflowError("range() result has too many items"); + } + + PyObject[] range = new PyObject[n]; + for (int i = 0; i < n; i++) { + range[i] = ilow.__long__(); + ilow = ilow.__add__(istep); + } + return new PyList(range); + } + + /** + * Return number of items in range (lo, hi, step), when arguments are PyInteger or + * PyLong objects. step > 0 required. Return a value < 0 if & only if the true value + * is too large to fit in an int, or there is an error. + * + * @param lo PyInteger or PyLong value + * @param hi PyInteger or PyLong value + * @param step PyInteger or PyLong value (> 0) + * @return int length of range + */ + private static int getLenOfRangeLongs(PyObject lo, PyObject hi, PyObject step) { + // if (lo >= hi), return length of 0 + if (lo._cmp(hi) >= 0) { + return 0; + } + try { + // See PyXRange.getLenOfRange for the primitive version + PyObject diff = hi.__sub__(lo).__sub__(Py.One); + PyObject n = diff.__floordiv__(step).__add__(Py.One); + return n.asInt(); + } catch (PyException pye) { + return -1; + } + } + private static PyString readline(PyObject file) { if (file instanceof PyFile) { return ((PyFile) file).readline(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-30 06:06:04
|
Revision: 5529 http://jython.svn.sourceforge.net/jython/?rev=5529&view=rev Author: pjenvey Date: 2008-10-30 06:06:03 +0000 (Thu, 30 Oct 2008) Log Message: ----------- allow NotImplemented and non ints that can be converted in Derived __cmp__ results Modified Paths: -------------- trunk/jython/Lib/test/test_cmp_jy.py trunk/jython/src/templates/object.derived Modified: trunk/jython/Lib/test/test_cmp_jy.py =================================================================== --- trunk/jython/Lib/test/test_cmp_jy.py 2008-10-30 03:05:31 UTC (rev 5528) +++ trunk/jython/Lib/test/test_cmp_jy.py 2008-10-30 06:06:03 UTC (rev 5529) @@ -31,12 +31,37 @@ assert (-2 < 'a') assert not (-1 == 'a') +class CustomCmp(unittest.TestCase): + def test___cmp___returns(self): + class Foo(object): + def __int__(self): + return 0 + class Bar(object): + def __int__(self): + raise ValueError('doh') + class Baz(object): + def __cmp__(self, other): + return self.cmp(other) + baz = Baz() + baz.cmp = lambda other : Foo() + self.assertEqual(cmp(100, baz), 0) + baz.cmp = lambda other : NotImplemented + self.assertEqual(cmp(100, baz), 1) + baz.cmp = lambda other: Bar() + self.assertRaises(ValueError, cmp, 100, baz) + baz.cmp = lambda other: 1 / 0 + self.assertRaises(ZeroDivisionError, cmp, 100, baz) + del Baz.__cmp__ + # CPython handles numbers differently than other types in + # object.c:default_3way_compare, and gets 1 here. we don't care + self.assert_(cmp(100, baz) in (-1, 1)) def test_main(): test_support.run_unittest( UnicodeDerivedCmp, LongDerivedCmp, IntStrCmp, + CustomCmp ) if __name__ == '__main__': Modified: trunk/jython/src/templates/object.derived =================================================================== --- trunk/jython/src/templates/object.derived 2008-10-30 03:05:31 UTC (rev 5528) +++ trunk/jython/src/templates/object.derived 2008-10-30 06:06:03 UTC (rev 5529) @@ -110,11 +110,11 @@ return super.__cmp__(other); } PyObject res = impl.__get__(this,self_type).__call__(other); - if (res instanceof PyInteger) { - int v=((PyInteger)res).getValue(); - return v < 0 ? -1 : v > 0 ? 1 : 0; + if (res == Py.NotImplemented) { + return -2; } - throw Py.TypeError("__cmp__ should return a int"); + int c = res.asInt(); + return c < 0 ? -1 : c > 0 ? 1 : 0; } public boolean __nonzero__() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-31 02:05:00
|
Revision: 5533 http://jython.svn.sourceforge.net/jython/?rev=5533&view=rev Author: pjenvey Date: 2008-10-31 02:04:57 +0000 (Fri, 31 Oct 2008) Log Message: ----------- add asDouble (like asInt), fix round conversion Modified Paths: -------------- trunk/jython/Lib/test/test_builtin_jy.py trunk/jython/src/org/python/core/PyFloat.java trunk/jython/src/org/python/core/PyObject.java trunk/jython/src/org/python/core/__builtin__.java Modified: trunk/jython/Lib/test/test_builtin_jy.py =================================================================== --- trunk/jython/Lib/test/test_builtin_jy.py 2008-10-30 22:43:59 UTC (rev 5532) +++ trunk/jython/Lib/test/test_builtin_jy.py 2008-10-31 02:04:57 UTC (rev 5533) @@ -102,11 +102,13 @@ return None self.assert_(not callable(Baz())) -class RangeTest(unittest.TestCase): +class ConversionTest(unittest.TestCase): class Foo(object): def __int__(self): return 3 + def __float__(self): + return 3.14 foo = Foo() def test_range_non_int(self): @@ -115,6 +117,9 @@ def test_xrange_non_int(self): self.assertEqual(list(xrange(self.foo)), [0, 1, 2]) + def test_round_non_float(self): + self.assertEqual(round(self.Foo(), 1), 3.1) + def test_main(): test.test_support.run_unittest(BuiltinTest, LoopTest, @@ -124,7 +129,7 @@ ReturnTest, ReprTest, CallableTest, - RangeTest) + ConversionTest) if __name__ == "__main__": test_main() Modified: trunk/jython/src/org/python/core/PyFloat.java =================================================================== --- trunk/jython/src/org/python/core/PyFloat.java 2008-10-30 22:43:59 UTC (rev 5532) +++ trunk/jython/src/org/python/core/PyFloat.java 2008-10-31 02:04:57 UTC (rev 5533) @@ -620,6 +620,10 @@ return float___getnewargs__(); } + public double asDouble() { + return value; + } + // standard singleton issues apply here to __getformat__/__setformat__, // but this is what Python demands Modified: trunk/jython/src/org/python/core/PyObject.java =================================================================== --- trunk/jython/src/org/python/core/PyObject.java 2008-10-30 22:43:59 UTC (rev 5532) +++ trunk/jython/src/org/python/core/PyObject.java 2008-10-31 02:04:57 UTC (rev 5533) @@ -3887,8 +3887,26 @@ } /** - * Coerce this object into an index-sized integer. + * Convert this object into a double. Throws a PyException on failure. * + * @return a double value + */ + public double asDouble() { + PyFloat floatObj; + try { + floatObj = __float__(); + } catch (PyException pye) { + if (Py.matchException(pye, Py.AttributeError)) { + throw Py.TypeError("a float is required"); + } + throw pye; + } + return floatObj.asDouble(); + } + + /** + * Convert this object into an index-sized integer. Throws a PyException on failure. + * * @return an index-sized int */ public int asIndex() { @@ -3896,7 +3914,7 @@ } /** - * Coerce this object into an index-sized integer. + * Convert this object into an index-sized integer. * * Throws a Python exception on Overflow if specified an exception type for err. * Modified: trunk/jython/src/org/python/core/__builtin__.java =================================================================== --- trunk/jython/src/org/python/core/__builtin__.java 2008-10-30 22:43:59 UTC (rev 5532) +++ trunk/jython/src/org/python/core/__builtin__.java 2008-10-31 02:04:57 UTC (rev 5533) @@ -1534,7 +1534,7 @@ ArgParser ap = new ArgParser("round", args, kwds, new String[] {"number", "ndigits"}, 0); PyObject number = ap.getPyObject(0); int ndigits = ap.getInt(1, 0); - return round(Py.py2double(number), ndigits); + return round(number.asDouble(), ndigits); } private static PyFloat round(double f, int digits) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <am...@us...> - 2008-10-31 15:59:49
|
Revision: 5535 http://jython.svn.sourceforge.net/jython/?rev=5535&view=rev Author: amak Date: 2008-10-31 15:59:39 +0000 (Fri, 31 Oct 2008) Log Message: ----------- Adding modjy to the jython distro. Simply adding the entire zip containing source, jars, docs, etc, for now. version being added is 0.22.3, which matches a label in the modjy repo. Modified Paths: -------------- trunk/jython/build.xml Added Paths: ----------- trunk/jython/extlibs/modjy_0_22_3.zip Modified: trunk/jython/build.xml =================================================================== --- trunk/jython/build.xml 2008-10-31 08:37:16 UTC (rev 5534) +++ trunk/jython/build.xml 2008-10-31 15:59:39 UTC (rev 5535) @@ -626,6 +626,7 @@ <include name="src/org/**/ucnhash.dat" /> <include name="grammar/*.g" /> <include name="extlibs/**/*.jar" /> + <include name="extlibs/**/*.zip" /> <include name="tests/java/**/*.java" /> <include name="CoreExposed.includes" /> </fileset> Added: trunk/jython/extlibs/modjy_0_22_3.zip =================================================================== (Binary files differ) Property changes on: trunk/jython/extlibs/modjy_0_22_3.zip ___________________________________________________________________ Added: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-10-31 16:33:50
|
Revision: 5537 http://jython.svn.sourceforge.net/jython/?rev=5537&view=rev Author: fwierzbicki Date: 2008-10-31 16:33:46 +0000 (Fri, 31 Oct 2008) Log Message: ----------- Change build labels to beta. Modified Paths: -------------- trunk/jython/README.txt trunk/jython/build.xml Modified: trunk/jython/README.txt =================================================================== --- trunk/jython/README.txt 2008-10-31 16:26:45 UTC (rev 5536) +++ trunk/jython/README.txt 2008-10-31 16:33:46 UTC (rev 5537) @@ -1,13 +1,10 @@ -Welcome to Jython 2.5a3 +Welcome to Jython 2.5b0 ======================= -This is the third alpha of the 2.5 version of Jython. It +This is the first beta of the 2.5 version of Jython. It contains most of the new features for the 2.5 release. -This release fixes an installation bug on windows and restores standalone -mode. - The release was compiled on Mac OS X with JDK 5 and requires JDK 5 to run. -As an alpha release, this release is incomplete and contains bugs. Do not +As a beta release, this release is incomplete and contains bugs. Do not use in a production environment. Modified: trunk/jython/build.xml =================================================================== --- trunk/jython/build.xml 2008-10-31 16:26:45 UTC (rev 5536) +++ trunk/jython/build.xml 2008-10-31 16:33:46 UTC (rev 5537) @@ -187,12 +187,12 @@ <property name="PY_RELEASE_LEVEL_SNAPSHOT" value="170"/> <!-- 0xAA --> <!-- The current version info --> - <property name="jython.version" value="2.5a3+"/> - <property name="jython.version.noplus" value="2.5a3"/> + <property name="jython.version" value="2.5b0+"/> + <property name="jython.version.noplus" value="2.5b0"/> <property name="jython.major_version" value="2"/> <property name="jython.minor_version" value="5"/> - <property name="jython.micro_version" value="3"/> - <property name="jython.release_level" value="${PY_RELEASE_LEVEL_ALPHA}"/> + <property name="jython.micro_version" value="0"/> + <property name="jython.release_level" value="${PY_RELEASE_LEVEL_BETA}"/> <property name="jython.release_serial" value="0"/> <condition property="do.snapshot.build"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-11-07 01:04:04
|
Revision: 5551 http://jython.svn.sourceforge.net/jython/?rev=5551&view=rev Author: pjenvey Date: 2008-11-07 01:04:00 +0000 (Fri, 07 Nov 2008) Log Message: ----------- o make the parser aware of the source encoding to fix str handling when encodings are specified. fixes test_doctest o distinguish unicode source w/ PyCF_SOURCE_IS_UTF8 instead of the Py.compile_flags byte[] variant. refactor __builtin__.compile o simplify ParserFacade by re-encoding unicode input; avoids the two prepBufReader code paths for InputStreams vs Readers. less efficient but CPython does this anyway Modified Paths: -------------- trunk/jython/Lib/test/test_builtin_jy.py trunk/jython/Lib/test/test_str_jy.py trunk/jython/Lib/test/test_unicode_jy.py trunk/jython/grammar/Python.g trunk/jython/src/org/python/antlr/BaseParser.java trunk/jython/src/org/python/antlr/ExpressionParser.java trunk/jython/src/org/python/antlr/GrammarActions.java trunk/jython/src/org/python/antlr/InteractiveParser.java trunk/jython/src/org/python/antlr/ModuleParser.java trunk/jython/src/org/python/core/ParserFacade.java trunk/jython/src/org/python/core/Py.java trunk/jython/src/org/python/core/__builtin__.java Modified: trunk/jython/Lib/test/test_builtin_jy.py =================================================================== --- trunk/jython/Lib/test/test_builtin_jy.py 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/Lib/test/test_builtin_jy.py 2008-11-07 01:04:00 UTC (rev 5551) @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- import sys import unittest import test.test_support @@ -120,6 +121,36 @@ def test_round_non_float(self): self.assertEqual(round(self.Foo(), 1), 3.1) +class ExecEvalTest(unittest.TestCase): + + bom = '\xef\xbb\xbf' + + def test_eval_bom(self): + self.assertEqual(eval(self.bom + '"foo"'), 'foo') + # Actual BOM ignored, so causes a SyntaxError + self.assertRaises(SyntaxError, eval, + self.bom.decode('iso-8859-1') + '"foo"') + + def test_parse_str_eval(self): + foo = 'föö' + for code in ("'%s'" % foo.decode('utf-8'), + "# coding: utf-8\n'%s'" % foo, + "%s'%s'" % (self.bom, foo)): + mod = compile(code, 'foo.py', 'eval') + bar = eval(mod) + self.assertEqual(foo, bar) + bar = eval(code) + self.assertEqual(foo, bar) + + def test_parse_str_exec(self): + foo = 'föö' + for code in ("a = '%s'" % foo.decode('utf-8'), + "# coding: utf-8\na = '%s'" % foo, + "%sa = '%s'" % (self.bom, foo)): + ns = {} + exec code in ns + self.assertEqual(foo, ns['a']) + def test_main(): test.test_support.run_unittest(BuiltinTest, LoopTest, @@ -129,7 +160,8 @@ ReturnTest, ReprTest, CallableTest, - ConversionTest) + ConversionTest, + ExecEvalTest) if __name__ == "__main__": test_main() Modified: trunk/jython/Lib/test/test_str_jy.py =================================================================== --- trunk/jython/Lib/test/test_str_jy.py 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/Lib/test/test_str_jy.py 2008-11-07 01:04:00 UTC (rev 5551) @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from test import test_support import unittest @@ -130,12 +131,47 @@ self.assertEqual(repr(test2), '"\'bar"') self.assertEqual(repr(unicode(test2)), 'u"\'bar"') + +class ParserTest(unittest.TestCase): + + def test_parse_str(self): + foo = 'ą\n' + self.assertEqual(len(foo), 3, repr(foo)) + self.assertEqual(repr(foo), "'\\xc4\\x85\\n'") + self.assertEqual(ord(foo[0]), 196) + self.assertEqual(ord(foo[1]), 133) + self.assertEqual(ord(foo[2]), 10) + + bar = foo.decode('utf-8') + self.assertEqual(len(bar), 2) + self.assertEqual(repr(bar), "u'\\u0105\\n'") + self.assertEqual(ord(bar[0]), 261) + self.assertEqual(ord(bar[1]), 10) + + def test_parse_raw_str(self): + foo = r'ą\n' + self.assertEqual(len(foo), 4, repr(foo)) + self.assertEqual(repr(foo), "'\\xc4\\x85\\\\n'") + self.assertEqual(ord(foo[0]), 196) + self.assertEqual(ord(foo[1]), 133) + self.assertEqual(ord(foo[2]), 92) + self.assertEqual(ord(foo[3]), 110) + + bar = foo.decode('utf-8') + self.assertEqual(len(bar), 3) + self.assertEqual(repr(bar), "u'\\u0105\\\\n'") + self.assertEqual(ord(bar[0]), 261) + self.assertEqual(ord(bar[1]), 92) + self.assertEqual(ord(bar[2]), 110) + def test_main(): - test_support.run_unittest(WrappedStrCmpTest, + test_support.run_unittest( + WrappedStrCmpTest, IntToStrTest, StringSlicingTest, FormatTest, - DisplayTest) + DisplayTest, + ParserTest) if __name__ == '__main__': test_main() Modified: trunk/jython/Lib/test/test_unicode_jy.py =================================================================== --- trunk/jython/Lib/test/test_unicode_jy.py 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/Lib/test/test_unicode_jy.py 2008-11-07 01:04:00 UTC (rev 5551) @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Misc unicode tests Made for Jython. @@ -19,7 +20,37 @@ self.assertEqual(chunker.match(quoted1, 1).groups(), (orig, u'"')) self.assertEqual(chunker.match(quoted2, 1).groups(), (orig, u'"')) + def test_parse_unicode(self): + foo = u'ą\n' + self.assertEqual(len(foo), 2, repr(foo)) + self.assertEqual(repr(foo), "u'\\u0105\\n'") + self.assertEqual(ord(foo[0]), 261) + self.assertEqual(ord(foo[1]), 10) + bar = foo.encode('utf-8') + self.assertEqual(len(bar), 3) + self.assertEqual(repr(bar), "'\\xc4\\x85\\n'") + self.assertEqual(ord(bar[0]), 196) + self.assertEqual(ord(bar[1]), 133) + self.assertEqual(ord(bar[2]), 10) + + def test_parse_raw_unicode(self): + foo = ur'ą\n' + self.assertEqual(len(foo), 3, repr(foo)) + self.assertEqual(repr(foo), "u'\\u0105\\\\n'") + self.assertEqual(ord(foo[0]), 261) + self.assertEqual(ord(foo[1]), 92) + self.assertEqual(ord(foo[2]), 110) + + bar = foo.encode('utf-8') + self.assertEqual(len(bar), 4) + self.assertEqual(repr(bar), "'\\xc4\\x85\\\\n'") + self.assertEqual(ord(bar[0]), 196) + self.assertEqual(ord(bar[1]), 133) + self.assertEqual(ord(bar[2]), 92) + self.assertEqual(ord(bar[3]), 110) + + def test_main(): test_support.run_unittest(UnicodeTestCase) Modified: trunk/jython/grammar/Python.g =================================================================== --- trunk/jython/grammar/Python.g 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/grammar/Python.g 2008-11-07 01:04:00 UTC (rev 5551) @@ -159,6 +159,8 @@ private GrammarActions actions = new GrammarActions(); + private String encoding; + public void setErrorHandler(ErrorHandler eh) { this.errorHandler = eh; actions.setErrorHandler(eh); @@ -180,6 +182,11 @@ return super.recoverFromMismatchedToken(input, ttype, follow); } + public PythonParser(TokenStream input, String encoding) { + this(input); + this.encoding = encoding; + } + } @rulecatch { @@ -1235,7 +1242,7 @@ | COMPLEX -> ^(COMPLEX<Num>[$COMPLEX, actions.makeComplex($COMPLEX)]) | (S+=STRING)+ - -> ^(STRING<Str>[actions.extractStringToken($S), actions.extractStrings($S)]) + -> ^(STRING<Str>[actions.extractStringToken($S), actions.extractStrings($S, encoding)]) ; //listmaker: test ( list_for | (',' test)* [','] ) Modified: trunk/jython/src/org/python/antlr/BaseParser.java =================================================================== --- trunk/jython/src/org/python/antlr/BaseParser.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/antlr/BaseParser.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -29,6 +29,7 @@ protected CharStream charStream; protected boolean partial; protected String filename; + protected String encoding; protected ErrorHandler errorHandler = new FailFastHandler(); public void setAntlrErrorHandler(ErrorHandler eh) { Modified: trunk/jython/src/org/python/antlr/ExpressionParser.java =================================================================== --- trunk/jython/src/org/python/antlr/ExpressionParser.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/antlr/ExpressionParser.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -16,9 +16,10 @@ public class ExpressionParser extends BaseParser { - public ExpressionParser(CharStream cs, String filename) { + public ExpressionParser(CharStream cs, String filename, String encoding) { this.charStream = cs; this.filename = filename; + this.encoding = encoding; } public modType parse() { @@ -28,7 +29,7 @@ CommonTokenStream tokens = new CommonTokenStream(lexer); PythonTokenSource indentedSource = new PythonTokenSource(tokens, filename); tokens = new CommonTokenStream(indentedSource); - PythonParser parser = new PythonParser(tokens); + PythonParser parser = new PythonParser(tokens, encoding); parser.setErrorHandler(errorHandler); parser.setTreeAdaptor(new PythonTreeAdaptor()); Modified: trunk/jython/src/org/python/antlr/GrammarActions.java =================================================================== --- trunk/jython/src/org/python/antlr/GrammarActions.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/antlr/GrammarActions.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -414,14 +414,14 @@ } } - PyString extractStrings(List s) { + PyString extractStrings(List s, String encoding) { boolean ustring = false; Token last = null; StringBuffer sb = new StringBuffer(); Iterator iter = s.iterator(); while (iter.hasNext()) { last = (Token)iter.next(); - StringPair sp = extractString(last); + StringPair sp = extractString(last, encoding); if (sp.isUnicode()) { ustring = true; } @@ -433,40 +433,51 @@ return new PyString(sb.toString()); } - StringPair extractString(Token t) { - String s = t.getText(); - char quoteChar = s.charAt(0); - int start=0; + StringPair extractString(Token t, String encoding) { + String string = t.getText(); + char quoteChar = string.charAt(0); + int start = 0; boolean ustring = false; if (quoteChar == 'u' || quoteChar == 'U') { ustring = true; start++; } - quoteChar = s.charAt(start); + quoteChar = string.charAt(start); boolean raw = false; if (quoteChar == 'r' || quoteChar == 'R') { raw = true; start++; } int quotes = 3; - if (s.length() - start == 2) { + if (string.length() - start == 2) { quotes = 1; } - if (s.charAt(start) != s.charAt(start+1)) { + if (string.charAt(start) != string.charAt(start+1)) { quotes = 1; } - if (raw) { - return new StringPair(s.substring(quotes+start, s.length()-quotes), ustring); + // string is properly decoded according to the source encoding + String result; + int end = string.length() - quotes; + start = quotes + start; + // XXX: No need to re-encode when the encoding is iso-8859-1, but ParserFacade + // needs to normalize the encoding name + if (!ustring && encoding != null) { + // Plain strs with a specified encoding: First re-encode them back out + result = new PyUnicode(string.substring(start, end)).encode(encoding); + if (!raw) { + // Handle escapes in non-raw strs + result = PyString.decode_UnicodeEscape(result, 0, result.length(), "strict", + ustring); + } + } else if (raw) { + // Raw str/unicode without an encoding (ascii): simply passthru + result = string.substring(start, end); } else { - StringBuffer sb = new StringBuffer(s.length()); - char[] ca = s.toCharArray(); - int n = ca.length-quotes; - int i=quotes+start; - int last_i=i; - return new StringPair(PyString.decode_UnicodeEscape(s, i, n, "strict", ustring), ustring); - //return decode_UnicodeEscape(s, i, n, "strict", ustring); + // Plain unicode: already decoded, just handle escapes + result = PyString.decode_UnicodeEscape(string, start, end, "strict", ustring); } + return new StringPair(result, ustring); } Token extractStringToken(List s) { Modified: trunk/jython/src/org/python/antlr/InteractiveParser.java =================================================================== --- trunk/jython/src/org/python/antlr/InteractiveParser.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/antlr/InteractiveParser.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -21,9 +21,10 @@ private BufferedReader bufreader; - public InteractiveParser(BufferedReader br, String filename) { + public InteractiveParser(BufferedReader br, String filename, String encoding) { this.bufreader = br; this.filename = filename; + this.encoding = encoding; } public modType parse() throws IOException { @@ -33,7 +34,7 @@ CommonTokenStream tokens = new CommonTokenStream(lexer); PythonTokenSource indentedSource = new PythonTokenSource(tokens, filename, true); tokens = new CommonTokenStream(indentedSource); - PythonParser parser = new PythonParser(tokens); + PythonParser parser = new PythonParser(tokens, encoding); parser.setErrorHandler(errorHandler); parser.setTreeAdaptor(new PythonTreeAdaptor()); Modified: trunk/jython/src/org/python/antlr/ModuleParser.java =================================================================== --- trunk/jython/src/org/python/antlr/ModuleParser.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/antlr/ModuleParser.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -15,14 +15,15 @@ import org.python.antlr.ast.stmtType; public class ModuleParser extends BaseParser { - public ModuleParser(CharStream cs, String filename) { - this(cs, filename, false); + public ModuleParser(CharStream cs, String filename, String encoding) { + this(cs, filename, encoding, false); } - public ModuleParser(CharStream cs, String filename, boolean partial) { - this.partial = partial; + public ModuleParser(CharStream cs, String filename, String encoding, boolean partial) { this.charStream = cs; this.filename = filename; + this.encoding = encoding; + this.partial = partial; } public modType file_input() { @@ -32,7 +33,7 @@ CommonTokenStream tokens = new CommonTokenStream(lexer); PythonTokenSource indentedSource = new PythonTokenSource(tokens, filename); tokens = new CommonTokenStream(indentedSource); - PythonParser parser = new PythonParser(tokens); + PythonParser parser = new PythonParser(tokens, encoding); parser.setErrorHandler(errorHandler); parser.setTreeAdaptor(new PythonTreeAdaptor()); try { Modified: trunk/jython/src/org/python/core/ParserFacade.java =================================================================== --- trunk/jython/src/org/python/core/ParserFacade.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/core/ParserFacade.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -7,9 +7,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.LineNumberReader; import java.io.Reader; -import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,11 +32,11 @@ import org.python.core.io.StreamIO; import org.python.core.io.TextIOInputStream; import org.python.core.io.UniversalIOWrapper; +import org.python.core.util.StringUtil; /** * Facade for the classes in the org.python.antlr package. */ - public class ParserFacade { private static int MARK_LIMIT = 100000; @@ -107,14 +105,14 @@ // validPartialSentence if (kind.equals("eval")) { CharStream cs = new NoCloseReaderStream(reader); - ExpressionParser e = new ExpressionParser(cs, filename); + ExpressionParser e = new ExpressionParser(cs, filename, cflags.encoding); return e.parse(); } else if (kind.equals("single")) { - InteractiveParser i = new InteractiveParser(reader, filename); + InteractiveParser i = new InteractiveParser(reader, filename, cflags.encoding); return i.parse(); } else if (kind.equals("exec")) { CharStream cs = new NoCloseReaderStream(reader); - ModuleParser g = new ModuleParser(cs, filename); + ModuleParser g = new ModuleParser(cs, filename, cflags.encoding); return g.file_input(); } else { throw Py.ValueError("parse kind must be eval, exec, or single"); @@ -129,7 +127,7 @@ try { // prepBufReader takes care of encoding detection and universal // newlines: - bufReader = prepBufreader(stream, cflags, filename); + bufReader = prepBufReader(stream, cflags, filename); return parse(bufReader, kind, filename, cflags ); } catch (Throwable t) { throw fixParseError(bufReader, t, filename); @@ -144,7 +142,7 @@ CompilerFlags cflags) { BufferedReader bufReader = null; try { - bufReader = prepBufReader(string); + bufReader = prepBufReader(string, cflags, filename); return parse(bufReader, kind, filename, cflags); } catch (Throwable t) { throw fixParseError(bufReader, t, filename); @@ -161,7 +159,7 @@ // XXX: What's the idea of the stdprompt argument? BufferedReader reader = null; try { - reader = prepBufReader(string); + reader = prepBufReader(string, cflags, filename); return parse(reader, kind, filename, cflags); } catch (Throwable t) { PyException p = fixParseError(reader, t, filename); @@ -194,75 +192,62 @@ } } catch (Exception e) { - System.out.println(e); return lexer.eofWhileNested; } return true; } - private static BufferedReader prepBufreader(InputStream istream, - CompilerFlags cflags, + private static BufferedReader prepBufReader(InputStream input, CompilerFlags cflags, String filename) throws IOException { - boolean bom = false; - String encoding = null; - InputStream bstream = new BufferedInputStream(istream); - bom = adjustForBOM(bstream); - encoding = readEncoding(bstream); + input = new BufferedInputStream(input); + boolean bom = adjustForBOM(input); + String encoding = readEncoding(input); if (encoding == null) { if (bom) { - encoding = "UTF-8"; + encoding = "utf-8"; } else if (cflags != null && cflags.encoding != null) { encoding = cflags.encoding; } } + if (cflags.source_is_utf8) { + if (encoding != null) { + throw new ParseException("encoding declaration in Unicode string"); + } + encoding = "utf-8"; + } + cflags.encoding = encoding; // Enable universal newlines mode on the input - StreamIO rawIO = new StreamIO(bstream, true); + StreamIO rawIO = new StreamIO(input, true); org.python.core.io.BufferedReader bufferedIO = new org.python.core.io.BufferedReader(rawIO, 0); UniversalIOWrapper textIO = new UniversalIOWrapper(bufferedIO); - bstream = new TextIOInputStream(textIO); + input = new TextIOInputStream(textIO); Reader reader; - if(encoding != null) { - try { - reader = new InputStreamReader(bstream, encoding); - } catch(UnsupportedEncodingException exc) { - throw new PySyntaxError("Encoding '" + encoding + "' isn't supported by this JVM.", 0, 0, "", filename); - } - } else { - try { - // Default to ISO-8859-1 to get bytes off the input stream since it leaves their values alone. - reader = new InputStreamReader(bstream, "ISO-8859-1"); - } catch(UnsupportedEncodingException e) { - // This JVM is whacked, it doesn't even have iso-8859-1 - throw Py.SystemError("Java couldn't find the ISO-8859-1 encoding"); - } + try { + // Using iso-8859-1 for the raw bytes when no encoding was specified + reader = new InputStreamReader(input, encoding == null ? "iso-8859-1" : encoding); + } catch (UnsupportedEncodingException exc) { + throw new PySyntaxError("Unknown encoding: " + encoding, 1, 0, "", filename); } - - BufferedReader bufreader = new BufferedReader(reader); - return bufreader; + return new BufferedReader(reader); } - private static BufferedReader prepBufReader(String string) throws IOException { - BufferedReader bufReader; - - // LineNumberReader takes care of universal newlines - bufReader = new LineNumberReader(new StringReader(string)); - - // If the input is a decoded string (implied from the String argument - // for prepBufReader), it can't have an encoding declaration. - bufReader.mark(MARK_LIMIT); - if (findEncoding(bufReader) != null) { - throw new ParseException("encoding declaration in Unicode string"); + private static BufferedReader prepBufReader(String string, CompilerFlags cflags, + String filename) throws IOException { + if (cflags.source_is_utf8) { + // Passed unicode, re-encode the String to raw bytes + // NOTE: This could be more efficient if we duplicate + // prepBufReader/adjustForBOM/readEncoding to work on Readers, instead of + // encoding + string = new PyUnicode(string).encode("utf-8"); } - bufReader.reset(); - - return bufReader; + InputStream input = new ByteArrayInputStream(StringUtil.toBytes(string)); + return prepBufReader(input, cflags, filename); } - /** * Check for a BOM mark at the begginning of stream. If there is a BOM * mark, advance the stream passed it. If not, reset() to start at the Modified: trunk/jython/src/org/python/core/Py.java =================================================================== --- trunk/jython/src/org/python/core/Py.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/core/Py.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -1190,6 +1190,7 @@ public static void exec(PyObject o, PyObject globals, PyObject locals) { PyCode code; + int flags = 0; if (o instanceof PyCode) { code = (PyCode) o; if (locals == null && o instanceof PyTableCode && ((PyTableCode) o).hasFreevars()) { @@ -1198,6 +1199,9 @@ } else { String contents = null; if (o instanceof PyString) { + if (o instanceof PyUnicode) { + flags |= PyTableCode.PyCF_SOURCE_IS_UTF8; + } contents = o.toString(); } else if (o instanceof PyFile) { PyFile fp = (PyFile) o; @@ -1210,7 +1214,7 @@ "exec: argument 1 must be string, code or file object"); } code = (PyCode)Py.compile_flags(contents, "<string>", "exec", - Py.getCompilerFlags()); + getCompilerFlags(flags, false)); } Py.runCode(code, locals, globals); } @@ -1683,31 +1687,6 @@ return Py.compile_flags(node, filename, kind, cflags); } - /** - * Compiles python source code coming from bytestrings - */ - public static PyObject compile_flags(byte[] bytes, String filename, - String kind, CompilerFlags cflags) { - for(int i = 0; i < bytes.length; i++) { - if (bytes[i] == 0) { - throw Py.TypeError("compile() expected string without null bytes"); - } - } - byte[] data; - if (cflags != null && cflags.dont_imply_dedent) { - data = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, data, 0, bytes.length); - data[data.length - 1] = '\n'; - } else { - data = new byte[bytes.length + 2]; - System.arraycopy(bytes, 0, data, 0, bytes.length); - data[data.length - 1] = data[data.length - 2] = '\n'; - } - modType node = ParserFacade.parse(new ByteArrayInputStream(data), kind, - filename, cflags); - return Py.compile_flags(node, filename, kind, cflags); - } - public static PyObject compile_command_flags(String string, String filename, String kind, CompilerFlags cflags, boolean stdprompt) { modType node = ParserFacade.partialParse(string + "\n", kind, filename, Modified: trunk/jython/src/org/python/core/__builtin__.java =================================================================== --- trunk/jython/src/org/python/core/__builtin__.java 2008-11-06 22:37:32 UTC (rev 5550) +++ trunk/jython/src/org/python/core/__builtin__.java 2008-11-07 01:04:00 UTC (rev 5551) @@ -1,8 +1,6 @@ // Copyright (c) Corporation for National Research Initiatives package org.python.core; -import java.io.ByteArrayInputStream; -import java.io.InputStream; import java.util.Iterator; import java.util.Map; @@ -264,26 +262,6 @@ public PyObject fancyCall(PyObject[] args) { switch (this.index) { - case 44: - if (args.length > 5) { - throw info.unexpectedCall(args.length, false); - } - int flags = 0; - if (args.length > 3) { - flags = Py.py2int(args[3]); - } - boolean dont_inherit = false; - if (args.length > 4) { - dont_inherit = Py.py2boolean(args[4]); - } - modType ast = py2node(args[0]); - if (ast != null) { - return __builtin__.compile(ast, args[1].toString(), args[2].toString(), flags, dont_inherit); - } - if (args[0] instanceof PyUnicode) { - flags += PyTableCode.PyCF_SOURCE_IS_UTF8; - } - return __builtin__.compile((PyString)args[0], args[1].toString(), args[2].toString(), flags, dont_inherit); case 29: return __builtin__.map(args); case 43: @@ -296,22 +274,6 @@ public PyObject getModule() { return module; } - - /** - * @returns modType if obj is a wrapper around an AST modType else returns - * null - * - * XXX: Reaches into implementation details -- needs to be reviewed if our - * java integration changes. - */ - private static modType py2node(PyObject obj) { - Object node = obj.__tojava__(modType.class); - if (node == Py.NoConversion) { - return null; - } - return (modType)node; - } - } /** @@ -374,7 +336,6 @@ dict.__setitem__("range", new BuiltinFunctions("range", 2, 1, 3)); dict.__setitem__("sum", new BuiltinFunctions("sum", 12, 1, 2)); dict.__setitem__("unichr", new BuiltinFunctions("unichr", 6, 1)); - dict.__setitem__("compile", new BuiltinFunctions("compile", 44, 3, -1)); dict.__setitem__("delattr", new BuiltinFunctions("delattr", 15, 2)); dict.__setitem__("dir", new BuiltinFunctions("dir", 16, 0, 1)); dict.__setitem__("divmod", new BuiltinFunctions("divmod", 17, 2)); @@ -402,6 +363,7 @@ dict.__setitem__("setattr", new BuiltinFunctions("setattr", 39, 3)); dict.__setitem__("vars", new BuiltinFunctions("vars", 41, 0, 1)); dict.__setitem__("zip", new BuiltinFunctions("zip", 43, 0, -1)); + dict.__setitem__("compile", new CompileFunction()); dict.__setitem__("reversed", new BuiltinFunctions("reversed", 45, 1)); dict.__setitem__("__import__", new ImportFunction()); dict.__setitem__("sorted", new SortedFunction()); @@ -475,38 +437,6 @@ throw Py.TypeError("number coercion failed"); } - public static PyObject compile(PyString data, String filename, String kind) { - if (data instanceof PyUnicode) { - return Py.compile_flags(data.toString(), filename, kind, Py.getCompilerFlags()); - } else { - return Py.compile_flags(data.toBytes(), filename, kind, Py.getCompilerFlags()); - } - } - - public static PyObject compile(modType node, String filename, String kind) { - return Py.compile_flags(node, filename, kind, Py.getCompilerFlags()); - } - - public static PyObject compile(PyString data, String filename, String kind, int flags, boolean dont_inherit) { - if ((flags & ~PyTableCode.CO_ALL_FEATURES) != 0) { - throw Py.ValueError("compile(): unrecognised flags"); - } - if (data instanceof PyUnicode) { - return Py.compile_flags(data.toString(), filename, kind, - Py.getCompilerFlags(flags, dont_inherit)); - } else { - return Py.compile_flags(data.toBytes(), filename, kind, - Py.getCompilerFlags(flags, dont_inherit)); - } - } - - public static PyObject compile(modType node, String filename, String kind, int flags, boolean dont_inherit) { - if ((flags & ~PyTableCode.CO_ALL_FEATURES) != 0) { - throw Py.ValueError("compile(): unrecognised flags"); - } - return Py.compile_flags(node, filename, kind, Py.getCompilerFlags(flags, dont_inherit)); - } - public static void delattr(PyObject o, String n) { o.__delattr__(n); } @@ -562,7 +492,7 @@ code = (PyCode) o; } else { if (o instanceof PyString) { - code = (PyCode)compile((PyString)o, "<string>", "eval"); + code = (PyCode)CompileFunction.compile((PyString)o, "<string>", "eval"); } else { throw Py.TypeError("eval: argument 1 must be string or code object"); } @@ -1562,3 +1492,77 @@ return new PyFloat(tmp / multiple); } } + +class CompileFunction extends PyBuiltinFunction { + CompileFunction() { + super("compile", + "compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\n" + + "Compile the source string (a Python module, statement or expression)\n" + + "into a code object that can be executed by the exec statement or eval().\n" + + "The filename will be used for run-time error messages.\n" + + "The mode must be 'exec' to compile a module, 'single' to compile a\n" + + "single (interactive) statement, or 'eval' to compile an expression.\n" + + "The flags argument, if present, controls which future statements influence\n" + + "the compilation of the code.\n" + + "The dont_inherit argument, if non-zero, stops the compilation inheriting\n" + + "the effects of any future statements in effect in the code calling\n" + + "compile; if absent or zero these statements do influence the compilation,\n" + + "in addition to any features explicitly specified."); + } + + public PyObject __call__(PyObject args[], String kwds[]) { + ArgParser ap = new ArgParser("compile", args, kwds, + new String[] {"source", "filename", "mode", "flags", + "dont_inherit"}, + 3); + PyObject source = ap.getPyObject(0); + String filename = ap.getString(1); + String mode = ap.getString(2); + int flags = ap.getInt(3, 0); + boolean dont_inherit = ap.getPyObject(4, Py.False).__nonzero__(); + return compile(source, filename, mode, flags, dont_inherit); + } + + public static PyObject compile(PyObject source, String filename, String mode) { + return compile(source, filename, mode, 0, false); + } + + public static PyObject compile(PyObject source, String filename, String mode, int flags, + boolean dont_inherit) { + if ((flags & ~PyTableCode.CO_ALL_FEATURES) != 0) { + throw Py.ValueError("compile(): unrecognised flags"); + } + if (!mode.equals("exec") && !mode.equals("eval") && !mode.equals("single")) { + throw Py.ValueError("compile() arg 3 must be 'exec' or 'eval' or 'single'"); + } + + modType ast = py2node(source); + if (ast != null) { + return Py.compile_flags(ast, filename, mode, Py.getCompilerFlags(flags, dont_inherit)); + } + + if (!(source instanceof PyString)) { + throw Py.TypeError("expected a readable buffer object"); + } + if (source instanceof PyUnicode) { + flags |= PyTableCode.PyCF_SOURCE_IS_UTF8; + } + return Py.compile_flags(((PyString)source).toString(), filename, mode, + Py.getCompilerFlags(flags, dont_inherit)); + } + + /** + * @returns modType if obj is a wrapper around an AST modType else returns + * null + * + * XXX: Reaches into implementation details -- needs to be reviewed if our + * java integration changes. + */ + private static modType py2node(PyObject obj) { + Object node = obj.__tojava__(modType.class); + if (node == Py.NoConversion) { + return null; + } + return (modType)node; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-11-07 08:20:28
|
Revision: 5555 http://jython.svn.sourceforge.net/jython/?rev=5555&view=rev Author: pjenvey Date: 2008-11-07 08:20:22 +0000 (Fri, 07 Nov 2008) Log Message: ----------- add a simple unicodeobject::PyUnicode_EncodeDecimal equivalent for unicode number conversion. fixes test_unicode.test_codecs_errors Modified Paths: -------------- trunk/jython/Lib/test/test_unicode_jy.py trunk/jython/src/org/python/core/PyUnicode.java Modified: trunk/jython/Lib/test/test_unicode_jy.py =================================================================== --- trunk/jython/Lib/test/test_unicode_jy.py 2008-11-07 05:27:30 UTC (rev 5554) +++ trunk/jython/Lib/test/test_unicode_jy.py 2008-11-07 08:20:22 UTC (rev 5555) @@ -50,7 +50,15 @@ self.assertEqual(ord(bar[2]), 92) self.assertEqual(ord(bar[3]), 110) + def test_encode_decimal(self): + self.assertEqual(int(u'\u0039\u0032'), 92) + self.assertEqual(int(u'\u0660'), 0) + self.assertEqual(int(u' \u001F\u0966\u096F\u0039'), 99) + self.assertEqual(long(u'\u0663'), 3) + self.assertEqual(float(u'\u0663.\u0661'), 3.1) + self.assertEqual(complex(u'\u0663.\u0661'), 3.1+0j) + def test_main(): test_support.run_unittest(UnicodeTestCase) Modified: trunk/jython/src/org/python/core/PyUnicode.java =================================================================== --- trunk/jython/src/org/python/core/PyUnicode.java 2008-11-07 05:27:30 UTC (rev 5554) +++ trunk/jython/src/org/python/core/PyUnicode.java 2008-11-07 08:20:22 UTC (rev 5555) @@ -1311,6 +1311,93 @@ return newSubsequenceIterator(); } + @Override + public PyComplex __complex__() { + return new PyString(encodeDecimal()).__complex__(); + } + + @Override + public int atoi(int base) { + return new PyString(encodeDecimal()).atoi(base); + } + + @Override + public PyLong atol(int base) { + return new PyString(encodeDecimal()).atol(base); + } + + @Override + public double atof() { + return new PyString(encodeDecimal()).atof(); + } + + /** + * Encode unicode into a valid decimal String. Throws a UnicodeEncodeError on invalid + * characters. + * + * @return a valid decimal as an encoded String + */ + private String encodeDecimal() { + if (isBasicPlane()) { + return encodeDecimalBasic(); + } + + int digit; + StringBuilder sb = new StringBuilder(); + int i = 0; + for (Iterator<Integer> iter = newSubsequenceIterator(); iter.hasNext(); i++) { + int codePoint = iter.next(); + if (Character.isWhitespace(codePoint)) { + sb.append(' '); + continue; + } + digit = Character.digit(codePoint, 10); + if (digit >= 0) { + sb.append(digit); + continue; + } + if (0 < codePoint && codePoint < 256) { + sb.appendCodePoint(codePoint); + continue; + } + // All other characters are considered unencodable + codecs.encoding_error("strict", "decimal", string, i, i + 1, + "invalid decimal Unicode string"); + } + return sb.toString(); + } + + /** + * Encode unicode in the basic plane into a valid decimal String. Throws a + * UnicodeEncodeError on invalid characters. + * + * @return a valid decimal as an encoded String + */ + private String encodeDecimalBasic() { + int digit; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < string.length(); i++) { + char ch = string.charAt(i); + if (Character.isWhitespace(ch)) { + sb.append(' '); + continue; + } + digit = Character.digit(ch, 10); + if (digit >= 0) { + sb.append(digit); + continue; + } + if (0 < ch && ch < 256) { + sb.append(ch); + continue; + } + // All other characters are considered unencodable + codecs.encoding_error("strict", "decimal", string, i, i + 1, + "invalid decimal Unicode string"); + } + return sb.toString(); + } + @ExposedMethod final String unicode_toString() { return toString(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-11-08 00:08:31
|
Revision: 5557 http://jython.svn.sourceforge.net/jython/?rev=5557&view=rev Author: pjenvey Date: 2008-11-08 00:08:20 +0000 (Sat, 08 Nov 2008) Log Message: ----------- rearrange the rich cmp methods so they can't call themselves fixes #1115 thanks Tom Mueller Modified Paths: -------------- trunk/jython/Lib/test/test_list_jy.py trunk/jython/src/org/python/core/PySequence.java Modified: trunk/jython/Lib/test/test_list_jy.py =================================================================== --- trunk/jython/Lib/test/test_list_jy.py 2008-11-07 08:25:32 UTC (rev 5556) +++ trunk/jython/Lib/test/test_list_jy.py 2008-11-08 00:08:20 UTC (rev 5557) @@ -1,17 +1,30 @@ import unittest import test.test_support -class ListTest(unittest.TestCase): - - def test_recursive_list_slices(self): - x = [1,2,3,4,5] - x[1:] = x +class ListTestCase(unittest.TestCase): - self.assertEquals(x, [1, 1, 2, 3, 4, 5], - "Recursive assignment to list slices failed") + def test_recursive_list_slices(self): + x = [1,2,3,4,5] + x[1:] = x + self.assertEquals(x, [1, 1, 2, 3, 4, 5], + "Recursive assignment to list slices failed") + def test_subclass_richcmp(self): + # http://bugs.jython.org/issue1115 + class Foo(list): + def __init__(self, dotstring): + list.__init__(self, map(int, dotstring.split("."))) + bar1 = Foo('1.2.3') + bar2 = Foo('1.2.4') + self.assert_(bar1 < bar2) + self.assert_(bar1 <= bar2) + self.assert_(bar2 > bar1) + self.assert_(bar2 >= bar1) + + def test_main(): - test.test_support.run_unittest(ListTest) + test.test_support.run_unittest(ListTestCase) + if __name__ == "__main__": - test_main() + test_main() Modified: trunk/jython/src/org/python/core/PySequence.java =================================================================== --- trunk/jython/src/org/python/core/PySequence.java 2008-11-07 08:25:32 UTC (rev 5556) +++ trunk/jython/src/org/python/core/PySequence.java 2008-11-08 00:08:20 UTC (rev 5557) @@ -136,6 +136,10 @@ } public synchronized PyObject __lt__(PyObject o) { + return seq___lt__(o); + } + + final synchronized PyObject seq___lt__(PyObject o) { if(!(getType() == o.getType()) && !(getType().isSubType(o.getType()))) { return null; } @@ -146,11 +150,11 @@ return __finditem__(i)._lt(o.__finditem__(i)); } - final synchronized PyObject seq___lt__(PyObject o) { - return __lt__(o); + public synchronized PyObject __le__(PyObject o) { + return seq___le__(o); } - public synchronized PyObject __le__(PyObject o) { + final synchronized PyObject seq___le__(PyObject o) { if(!(getType() == o.getType()) && !(getType().isSubType(o.getType()))) { return null; } @@ -161,11 +165,11 @@ return __finditem__(i)._le(o.__finditem__(i)); } - final synchronized PyObject seq___le__(PyObject o) { - return __le__(o); + public synchronized PyObject __gt__(PyObject o) { + return seq___gt__(o); } - public synchronized PyObject __gt__(PyObject o) { + final synchronized PyObject seq___gt__(PyObject o) { if(!(getType() == o.getType()) && !(getType().isSubType(o.getType()))) { return null; } @@ -175,11 +179,11 @@ return __finditem__(i)._gt(o.__finditem__(i)); } - final synchronized PyObject seq___gt__(PyObject o) { - return __gt__(o); + public synchronized PyObject __ge__(PyObject o) { + return seq___ge__(o); } - public synchronized PyObject __ge__(PyObject o) { + final synchronized PyObject seq___ge__(PyObject o) { if(!(getType() == o.getType()) && !(getType().isSubType(o.getType()))) { return null; } @@ -190,10 +194,6 @@ return __finditem__(i)._ge(o.__finditem__(i)); } - final synchronized PyObject seq___ge__(PyObject o) { - return __ge__(o); - } - // Return value >= 0 is the index where the sequences differs. // -1: reached the end of o1 without a difference // -2: reached the end of both seqeunces without a difference This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-11-10 02:53:09
|
Revision: 5562 http://jython.svn.sourceforge.net/jython/?rev=5562&view=rev Author: pjenvey Date: 2008-11-10 02:53:05 +0000 (Mon, 10 Nov 2008) Log Message: ----------- fix %c formatting to support unicode refs #1768075, fixes #1780767 Modified Paths: -------------- trunk/jython/Lib/test/test_unicode_jy.py trunk/jython/src/org/python/core/PyString.java Modified: trunk/jython/Lib/test/test_unicode_jy.py =================================================================== --- trunk/jython/Lib/test/test_unicode_jy.py 2008-11-10 01:22:11 UTC (rev 5561) +++ trunk/jython/Lib/test/test_unicode_jy.py 2008-11-10 02:53:05 UTC (rev 5562) @@ -4,6 +4,7 @@ Made for Jython. """ import re +import sys import unittest from test import test_support @@ -58,7 +59,20 @@ self.assertEqual(float(u'\u0663.\u0661'), 3.1) self.assertEqual(complex(u'\u0663.\u0661'), 3.1+0j) + def test_formatchar(self): + self.assertEqual('%c' % 255, '\xff') + self.assertRaises(OverflowError, '%c'.__mod__, 256) + result = u'%c' % 256 + self.assert_(isinstance(result, unicode)) + self.assertEqual(result, u'\u0100') + if sys.maxunicode == 0xffff: + self.assertEqual(u'%c' % sys.maxunicode, u'\uffff') + else: + self.assertEqual(u'%c' % sys.maxunicode, u'\U0010ffff') + self.assertRaises(OverflowError, '%c'.__mod__, sys.maxunicode + 1) + + def test_main(): test_support.run_unittest(UnicodeTestCase) Modified: trunk/jython/src/org/python/core/PyString.java =================================================================== --- trunk/jython/src/org/python/core/PyString.java 2008-11-10 01:22:11 UTC (rev 5561) +++ trunk/jython/src/org/python/core/PyString.java 2008-11-10 02:53:05 UTC (rev 5562) @@ -2960,12 +2960,16 @@ } throw e; } - if (val < 0) { - throw Py.OverflowError("unsigned byte integer is less than minimum"); - } else if (val > 255) { - throw Py.OverflowError("unsigned byte integer is greater than maximum"); + if (!needUnicode) { + if (val < 0) { + throw Py.OverflowError("unsigned byte integer is less than minimum"); + } else if (val > 255) { + throw Py.OverflowError("unsigned byte integer is greater than maximum"); + } + } else if (val < 0 || val > PySystemState.maxunicode) { + throw Py.OverflowError("%c arg not in range(0x110000) (wide Python build)"); } - string = new Character((char)val).toString(); + string = new String(new int[] {val}, 0, 1); break; default: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-11-10 03:36:39
|
Revision: 5565 http://jython.svn.sourceforge.net/jython/?rev=5565&view=rev Author: fwierzbicki Date: 2008-11-10 03:36:31 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Just enough AST tweaking to get some of sympy working for Ondrej. On my todo list is to look at Python 2.6's ast testing and see if I can port that over to Jython. Modified Paths: -------------- trunk/jython/ast/asdl_antlr.py trunk/jython/src/org/python/antlr/AST.java trunk/jython/src/org/python/antlr/PythonTree.java trunk/jython/src/org/python/antlr/ast/Assert.java trunk/jython/src/org/python/antlr/ast/Assign.java trunk/jython/src/org/python/antlr/ast/Attribute.java trunk/jython/src/org/python/antlr/ast/AugAssign.java trunk/jython/src/org/python/antlr/ast/BinOp.java trunk/jython/src/org/python/antlr/ast/BoolOp.java trunk/jython/src/org/python/antlr/ast/Break.java trunk/jython/src/org/python/antlr/ast/Call.java trunk/jython/src/org/python/antlr/ast/ClassDef.java trunk/jython/src/org/python/antlr/ast/Compare.java trunk/jython/src/org/python/antlr/ast/Continue.java trunk/jython/src/org/python/antlr/ast/Delete.java trunk/jython/src/org/python/antlr/ast/Dict.java trunk/jython/src/org/python/antlr/ast/Ellipsis.java trunk/jython/src/org/python/antlr/ast/ErrorExpr.java trunk/jython/src/org/python/antlr/ast/ErrorMod.java trunk/jython/src/org/python/antlr/ast/ErrorSlice.java trunk/jython/src/org/python/antlr/ast/ErrorStmt.java trunk/jython/src/org/python/antlr/ast/Exec.java trunk/jython/src/org/python/antlr/ast/Expr.java trunk/jython/src/org/python/antlr/ast/Expression.java trunk/jython/src/org/python/antlr/ast/ExtSlice.java trunk/jython/src/org/python/antlr/ast/For.java trunk/jython/src/org/python/antlr/ast/FunctionDef.java trunk/jython/src/org/python/antlr/ast/GeneratorExp.java trunk/jython/src/org/python/antlr/ast/Global.java trunk/jython/src/org/python/antlr/ast/If.java trunk/jython/src/org/python/antlr/ast/IfExp.java trunk/jython/src/org/python/antlr/ast/Import.java trunk/jython/src/org/python/antlr/ast/ImportFrom.java trunk/jython/src/org/python/antlr/ast/Index.java trunk/jython/src/org/python/antlr/ast/Interactive.java trunk/jython/src/org/python/antlr/ast/Lambda.java trunk/jython/src/org/python/antlr/ast/List.java trunk/jython/src/org/python/antlr/ast/ListComp.java trunk/jython/src/org/python/antlr/ast/Module.java trunk/jython/src/org/python/antlr/ast/Name.java trunk/jython/src/org/python/antlr/ast/Num.java trunk/jython/src/org/python/antlr/ast/Pass.java trunk/jython/src/org/python/antlr/ast/Print.java trunk/jython/src/org/python/antlr/ast/Raise.java trunk/jython/src/org/python/antlr/ast/Repr.java trunk/jython/src/org/python/antlr/ast/Return.java trunk/jython/src/org/python/antlr/ast/Slice.java trunk/jython/src/org/python/antlr/ast/Str.java trunk/jython/src/org/python/antlr/ast/Subscript.java trunk/jython/src/org/python/antlr/ast/Suite.java trunk/jython/src/org/python/antlr/ast/TryExcept.java trunk/jython/src/org/python/antlr/ast/TryFinally.java trunk/jython/src/org/python/antlr/ast/Tuple.java trunk/jython/src/org/python/antlr/ast/UnaryOp.java trunk/jython/src/org/python/antlr/ast/While.java trunk/jython/src/org/python/antlr/ast/With.java trunk/jython/src/org/python/antlr/ast/Yield.java trunk/jython/src/org/python/antlr/ast/aliasType.java trunk/jython/src/org/python/antlr/ast/argumentsType.java trunk/jython/src/org/python/antlr/ast/boolopType.java trunk/jython/src/org/python/antlr/ast/cmpopType.java trunk/jython/src/org/python/antlr/ast/comprehensionType.java trunk/jython/src/org/python/antlr/ast/excepthandlerType.java trunk/jython/src/org/python/antlr/ast/exprType.java trunk/jython/src/org/python/antlr/ast/expr_contextType.java trunk/jython/src/org/python/antlr/ast/keywordType.java trunk/jython/src/org/python/antlr/ast/modType.java trunk/jython/src/org/python/antlr/ast/operatorType.java trunk/jython/src/org/python/antlr/ast/sliceType.java trunk/jython/src/org/python/antlr/ast/stmtType.java trunk/jython/src/org/python/antlr/ast/unaryopType.java Modified: trunk/jython/ast/asdl_antlr.py =================================================================== --- trunk/jython/ast/asdl_antlr.py 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/ast/asdl_antlr.py 2008-11-10 03:36:31 UTC (rev 5565) @@ -142,9 +142,13 @@ self.emit('', 0) self.emit("public enum %(name)sType implements AST {" % locals(), depth) self.emit("UNDEFINED,", depth + 1) - for i in range(len(sum.types)): + for i in range(len(sum.types) - 1): type = sum.types[i] self.emit("%s," % type.name, depth + 1) + self.emit("%s;" % sum.types[len(sum.types) - 1].name, depth + 1) + + self.attributes(sum, depth, True); + #self.emit("", 0) #self.emit("public static final String[] %sTypeNames = new String[] {" % # name, depth+1) @@ -154,13 +158,49 @@ #self.emit("};", depth+1) self.emit("}", depth) self.close() + + def attributes(self, obj, depth, always_emit=False): + field_list = [] + if hasattr(obj, "fields"): + for f in obj.fields: + field_list.append('"%s"' % f.name) + if len(field_list) > 0: + self.emit("private final static String[] fields = new String[] {%s};" % + ", ".join(field_list), depth+1) + self.emit("public String[] get_fields() { return fields; }", depth+1) + self.emit("", 0) + elif always_emit: + self.emit("private final static String[] fields = new String[0];", depth+1) + self.emit("public String[] get_fields() { return fields; }", depth+1) + self.emit("", 0) + + att_list = [] + if hasattr(obj, "attributes"): + for a in obj.attributes: + att_list.append('"%s"' % a.name) + if len(att_list) > 0: + self.emit("private final static String[] attributes = new String[] {%s};" % + ", ".join(att_list), depth+1) + self.emit("public String[] get_attributes() { return attributes; }", depth+1) + self.emit("", 0) + elif always_emit: + self.emit("private final static String[] attributes = new String[0];", depth+1) + self.emit("public String[] get_attributes() { return attributes; }", depth+1) + self.emit("", 0) def sum_with_constructor(self, sum, name, depth): self.open("%sType" % name) + self.emit("public abstract class %(name)sType extends PythonTree {" % locals(), depth) self.emit("", 0) + self.attributes(sum, depth); + + self.emit("public %(name)sType() {" % locals(), depth+1) + self.emit("}", depth+1) + self.emit("", 0) + self.emit("public %(name)sType(int ttype, Token token) {" % locals(), depth+1) self.emit("super(ttype, token);", depth+2) self.emit("}", depth+1) @@ -189,13 +229,7 @@ self.visit(f, depth + 1) self.emit("", depth) - ##XXX: extract - field_list = [] - for f in product.fields: - field_list.append('"%s"' % f.name) - self.emit("public static final String[] _fields = new String[] {%s};" % - ",".join(field_list), depth+1) - self.emit("", 0) + self.attributes(product, depth) self.javaMethods(product, name, "%sType" % name, product.fields, depth+1) @@ -219,13 +253,7 @@ self.visit(f, depth + 1) self.emit("", depth) - ##XXX: extract - field_list = [] - for f in cons.fields: - field_list.append('"%s"' % f.name) - self.emit("public static final String[] _fields = new String[] {%s};" % - ",".join(field_list), depth+1) - self.emit("", 0) + self.attributes(cons, depth) self.javaMethods(cons, cons.name, cons.name, cons.fields, depth+1) @@ -273,6 +301,12 @@ def javaMethods(self, type, clsname, ctorname, fields, depth): # The java ctors + fpargs = ", ".join([self.fieldDef(f) for f in fields]) + self.emit("public %s(%s) {" % (ctorname, fpargs), depth) + self.javaConstructorHelper(fields, depth) + self.emit("}", depth) + self.emit("", 0) + token = asdl.Field('Token', 'token') token.typedef = False fpargs = ", ".join([self.fieldDef(f) for f in [token] + fields]) @@ -427,7 +461,6 @@ if not sum.simple: for t in sum.types: self.visit(t, name, depth) - def visitProduct(self, product, name, depth): pass Modified: trunk/jython/src/org/python/antlr/AST.java =================================================================== --- trunk/jython/src/org/python/antlr/AST.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/AST.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -1,3 +1,8 @@ package org.python.antlr; -public interface AST {} +public interface AST { + public static String[] emptyStringArray = new String[0]; + + public String[] get_attributes(); + public String[] get_fields(); +} Modified: trunk/jython/src/org/python/antlr/PythonTree.java =================================================================== --- trunk/jython/src/org/python/antlr/PythonTree.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/PythonTree.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -27,9 +27,6 @@ /** What index is this node in the child list? Range: 0..n-1 */ public int childIndex = -1; - /** - * The empty constructor is intended only for use by PythonErrorNode. - */ public PythonTree() { } @@ -255,4 +252,12 @@ public void traverse(VisitorIF visitor) throws Exception { throw new RuntimeException("Cannot traverse node: " + this); } + + public String[] get_fields() { + return emptyStringArray; + } + + public String[] get_attributes() { + return emptyStringArray; + } } Modified: trunk/jython/src/org/python/antlr/ast/Assert.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Assert.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Assert.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,16 @@ public exprType test; public exprType msg; - public static final String[] _fields = new String[] {"test","msg"}; + private final static String[] fields = new String[] {"test", "msg"}; + public String[] get_fields() { return fields; } + public Assert(exprType test, exprType msg) { + this.test = test; + addChild(test); + this.msg = msg; + addChild(msg); + } + public Assert(Token token, exprType test, exprType msg) { super(token); this.test = test; Modified: trunk/jython/src/org/python/antlr/ast/Assign.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Assign.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Assign.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,20 @@ public exprType[] targets; public exprType value; - public static final String[] _fields = new String[] {"targets","value"}; + private final static String[] fields = new String[] {"targets", "value"}; + public String[] get_fields() { return fields; } + public Assign(exprType[] targets, exprType value) { + this.targets = targets; + if (targets != null) { + for(int itargets=0;itargets<targets.length;itargets++) { + addChild(targets[itargets]); + } + } + this.value = value; + addChild(value); + } + public Assign(Token token, exprType[] targets, exprType value) { super(token); this.targets = targets; Modified: trunk/jython/src/org/python/antlr/ast/Attribute.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Attribute.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Attribute.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,8 +11,17 @@ public String attr; public expr_contextType ctx; - public static final String[] _fields = new String[] {"value","attr","ctx"}; + private final static String[] fields = new String[] {"value", "attr", + "ctx"}; + public String[] get_fields() { return fields; } + public Attribute(exprType value, String attr, expr_contextType ctx) { + this.value = value; + addChild(value); + this.attr = attr; + this.ctx = ctx; + } + public Attribute(Token token, exprType value, String attr, expr_contextType ctx) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/AugAssign.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/AugAssign.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/AugAssign.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,8 +11,18 @@ public operatorType op; public exprType value; - public static final String[] _fields = new String[] {"target","op","value"}; + private final static String[] fields = new String[] {"target", "op", + "value"}; + public String[] get_fields() { return fields; } + public AugAssign(exprType target, operatorType op, exprType value) { + this.target = target; + addChild(target); + this.op = op; + this.value = value; + addChild(value); + } + public AugAssign(Token token, exprType target, operatorType op, exprType value) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/BinOp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/BinOp.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/BinOp.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,8 +11,17 @@ public operatorType op; public exprType right; - public static final String[] _fields = new String[] {"left","op","right"}; + private final static String[] fields = new String[] {"left", "op", "right"}; + public String[] get_fields() { return fields; } + public BinOp(exprType left, operatorType op, exprType right) { + this.left = left; + addChild(left); + this.op = op; + this.right = right; + addChild(right); + } + public BinOp(Token token, exprType left, operatorType op, exprType right) { super(token); this.left = left; Modified: trunk/jython/src/org/python/antlr/ast/BoolOp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/BoolOp.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/BoolOp.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,19 @@ public boolopType op; public exprType[] values; - public static final String[] _fields = new String[] {"op","values"}; + private final static String[] fields = new String[] {"op", "values"}; + public String[] get_fields() { return fields; } + public BoolOp(boolopType op, exprType[] values) { + this.op = op; + this.values = values; + if (values != null) { + for(int ivalues=0;ivalues<values.length;ivalues++) { + addChild(values[ivalues]); + } + } + } + public BoolOp(Token token, boolopType op, exprType[] values) { super(token); this.op = op; Modified: trunk/jython/src/org/python/antlr/ast/Break.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Break.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Break.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -8,7 +8,8 @@ public class Break extends stmtType { - public static final String[] _fields = new String[] {}; + public Break() { + } public Break(Token token) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Call.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Call.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Call.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -13,9 +13,33 @@ public exprType starargs; public exprType kwargs; - public static final String[] _fields = new String[] - {"func","args","keywords","starargs","kwargs"}; + private final static String[] fields = new String[] {"func", "args", + "keywords", + "starargs", "kwargs"}; + public String[] get_fields() { return fields; } + public Call(exprType func, exprType[] args, keywordType[] keywords, + exprType starargs, exprType kwargs) { + this.func = func; + addChild(func); + this.args = args; + if (args != null) { + for(int iargs=0;iargs<args.length;iargs++) { + addChild(args[iargs]); + } + } + this.keywords = keywords; + if (keywords != null) { + for(int ikeywords=0;ikeywords<keywords.length;ikeywords++) { + addChild(keywords[ikeywords]); + } + } + this.starargs = starargs; + addChild(starargs); + this.kwargs = kwargs; + addChild(kwargs); + } + public Call(Token token, exprType func, exprType[] args, keywordType[] keywords, exprType starargs, exprType kwargs) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/ClassDef.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ClassDef.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ClassDef.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -12,9 +12,33 @@ public stmtType[] body; public exprType[] decorators; - public static final String[] _fields = new String[] - {"name","bases","body","decorators"}; + private final static String[] fields = new String[] {"name", "bases", + "body", "decorators"}; + public String[] get_fields() { return fields; } + public ClassDef(String name, exprType[] bases, stmtType[] body, exprType[] + decorators) { + this.name = name; + this.bases = bases; + if (bases != null) { + for(int ibases=0;ibases<bases.length;ibases++) { + addChild(bases[ibases]); + } + } + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.decorators = decorators; + if (decorators != null) { + for(int idecorators=0;idecorators<decorators.length;idecorators++) { + addChild(decorators[idecorators]); + } + } + } + public ClassDef(Token token, String name, exprType[] bases, stmtType[] body, exprType[] decorators) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Compare.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Compare.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Compare.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,23 @@ public cmpopType[] ops; public exprType[] comparators; - public static final String[] _fields = new String[] - {"left","ops","comparators"}; + private final static String[] fields = new String[] {"left", "ops", + "comparators"}; + public String[] get_fields() { return fields; } + public Compare(exprType left, cmpopType[] ops, exprType[] comparators) { + this.left = left; + addChild(left); + this.ops = ops; + this.comparators = comparators; + if (comparators != null) { + for(int + icomparators=0;icomparators<comparators.length;icomparators++) { + addChild(comparators[icomparators]); + } + } + } + public Compare(Token token, exprType left, cmpopType[] ops, exprType[] comparators) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Continue.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Continue.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Continue.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -8,7 +8,8 @@ public class Continue extends stmtType { - public static final String[] _fields = new String[] {}; + public Continue() { + } public Continue(Token token) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Delete.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Delete.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Delete.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,18 @@ public class Delete extends stmtType { public exprType[] targets; - public static final String[] _fields = new String[] {"targets"}; + private final static String[] fields = new String[] {"targets"}; + public String[] get_fields() { return fields; } + public Delete(exprType[] targets) { + this.targets = targets; + if (targets != null) { + for(int itargets=0;itargets<targets.length;itargets++) { + addChild(targets[itargets]); + } + } + } + public Delete(Token token, exprType[] targets) { super(token); this.targets = targets; Modified: trunk/jython/src/org/python/antlr/ast/Dict.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Dict.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Dict.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,24 @@ public exprType[] keys; public exprType[] values; - public static final String[] _fields = new String[] {"keys","values"}; + private final static String[] fields = new String[] {"keys", "values"}; + public String[] get_fields() { return fields; } + public Dict(exprType[] keys, exprType[] values) { + this.keys = keys; + if (keys != null) { + for(int ikeys=0;ikeys<keys.length;ikeys++) { + addChild(keys[ikeys]); + } + } + this.values = values; + if (values != null) { + for(int ivalues=0;ivalues<values.length;ivalues++) { + addChild(values[ivalues]); + } + } + } + public Dict(Token token, exprType[] keys, exprType[] values) { super(token); this.keys = keys; Modified: trunk/jython/src/org/python/antlr/ast/Ellipsis.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Ellipsis.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Ellipsis.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -8,7 +8,8 @@ public class Ellipsis extends sliceType { - public static final String[] _fields = new String[] {}; + public Ellipsis() { + } public Ellipsis(Token token) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/ErrorExpr.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ErrorExpr.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ErrorExpr.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -3,8 +3,6 @@ public class ErrorExpr extends exprType { - public static final String[] _fields = new String[] {}; - public ErrorExpr(PythonTree tree) { super(tree); } Modified: trunk/jython/src/org/python/antlr/ast/ErrorMod.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ErrorMod.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ErrorMod.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -3,8 +3,6 @@ public class ErrorMod extends modType { - public static final String[] _fields = new String[] {}; - public ErrorMod(PythonTree tree) { super(tree); } Modified: trunk/jython/src/org/python/antlr/ast/ErrorSlice.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ErrorSlice.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ErrorSlice.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -7,8 +7,6 @@ public class ErrorSlice extends sliceType { - public static final String[] _fields = new String[] {}; - public ErrorSlice(PythonTree tree) { super(tree); } Modified: trunk/jython/src/org/python/antlr/ast/ErrorStmt.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ErrorStmt.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ErrorStmt.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -7,8 +7,6 @@ public class ErrorStmt extends stmtType { - public static final String[] _fields = new String[] {}; - public ErrorStmt(PythonTree tree) { super(tree); } Modified: trunk/jython/src/org/python/antlr/ast/Exec.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Exec.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Exec.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,19 @@ public exprType globals; public exprType locals; - public static final String[] _fields = new String[] - {"body","globals","locals"}; + private final static String[] fields = new String[] {"body", "globals", + "locals"}; + public String[] get_fields() { return fields; } + public Exec(exprType body, exprType globals, exprType locals) { + this.body = body; + addChild(body); + this.globals = globals; + addChild(globals); + this.locals = locals; + addChild(locals); + } + public Exec(Token token, exprType body, exprType globals, exprType locals) { super(token); this.body = body; Modified: trunk/jython/src/org/python/antlr/ast/Expr.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Expr.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Expr.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,14 @@ public class Expr extends stmtType { public exprType value; - public static final String[] _fields = new String[] {"value"}; + private final static String[] fields = new String[] {"value"}; + public String[] get_fields() { return fields; } + public Expr(exprType value) { + this.value = value; + addChild(value); + } + public Expr(Token token, exprType value) { super(token); this.value = value; Modified: trunk/jython/src/org/python/antlr/ast/Expression.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Expression.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Expression.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,14 @@ public class Expression extends modType { public exprType body; - public static final String[] _fields = new String[] {"body"}; + private final static String[] fields = new String[] {"body"}; + public String[] get_fields() { return fields; } + public Expression(exprType body) { + this.body = body; + addChild(body); + } + public Expression(Token token, exprType body) { super(token); this.body = body; Modified: trunk/jython/src/org/python/antlr/ast/ExtSlice.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ExtSlice.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ExtSlice.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,18 @@ public class ExtSlice extends sliceType { public sliceType[] dims; - public static final String[] _fields = new String[] {"dims"}; + private final static String[] fields = new String[] {"dims"}; + public String[] get_fields() { return fields; } + public ExtSlice(sliceType[] dims) { + this.dims = dims; + if (dims != null) { + for(int idims=0;idims<dims.length;idims++) { + addChild(dims[idims]); + } + } + } + public ExtSlice(Token token, sliceType[] dims) { super(token); this.dims = dims; Modified: trunk/jython/src/org/python/antlr/ast/For.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/For.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/For.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -12,9 +12,30 @@ public stmtType[] body; public stmtType[] orelse; - public static final String[] _fields = new String[] - {"target","iter","body","orelse"}; + private final static String[] fields = new String[] {"target", "iter", + "body", "orelse"}; + public String[] get_fields() { return fields; } + public For(exprType target, exprType iter, stmtType[] body, stmtType[] + orelse) { + this.target = target; + addChild(target); + this.iter = iter; + addChild(iter); + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.orelse = orelse; + if (orelse != null) { + for(int iorelse=0;iorelse<orelse.length;iorelse++) { + addChild(orelse[iorelse]); + } + } + } + public For(Token token, exprType target, exprType iter, stmtType[] body, stmtType[] orelse) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/FunctionDef.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/FunctionDef.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/FunctionDef.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -12,9 +12,28 @@ public stmtType[] body; public exprType[] decorators; - public static final String[] _fields = new String[] - {"name","args","body","decorators"}; + private final static String[] fields = new String[] {"name", "args", + "body", "decorators"}; + public String[] get_fields() { return fields; } + public FunctionDef(String name, argumentsType args, stmtType[] body, + exprType[] decorators) { + this.name = name; + this.args = args; + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.decorators = decorators; + if (decorators != null) { + for(int idecorators=0;idecorators<decorators.length;idecorators++) { + addChild(decorators[idecorators]); + } + } + } + public FunctionDef(Token token, String name, argumentsType args, stmtType[] body, exprType[] decorators) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/GeneratorExp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/GeneratorExp.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/GeneratorExp.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,20 @@ public exprType elt; public comprehensionType[] generators; - public static final String[] _fields = new String[] {"elt","generators"}; + private final static String[] fields = new String[] {"elt", "generators"}; + public String[] get_fields() { return fields; } + public GeneratorExp(exprType elt, comprehensionType[] generators) { + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators != null) { + for(int igenerators=0;igenerators<generators.length;igenerators++) { + addChild(generators[igenerators]); + } + } + } + public GeneratorExp(Token token, exprType elt, comprehensionType[] generators) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Global.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Global.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Global.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,13 @@ public class Global extends stmtType { public String[] names; - public static final String[] _fields = new String[] {"names"}; + private final static String[] fields = new String[] {"names"}; + public String[] get_fields() { return fields; } + public Global(String[] names) { + this.names = names; + } + public Global(Token token, String[] names) { super(token); this.names = names; Modified: trunk/jython/src/org/python/antlr/ast/If.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/If.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/If.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,27 @@ public stmtType[] body; public stmtType[] orelse; - public static final String[] _fields = new String[] - {"test","body","orelse"}; + private final static String[] fields = new String[] {"test", "body", + "orelse"}; + public String[] get_fields() { return fields; } + public If(exprType test, stmtType[] body, stmtType[] orelse) { + this.test = test; + addChild(test); + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.orelse = orelse; + if (orelse != null) { + for(int iorelse=0;iorelse<orelse.length;iorelse++) { + addChild(orelse[iorelse]); + } + } + } + public If(Token token, exprType test, stmtType[] body, stmtType[] orelse) { super(token); this.test = test; Modified: trunk/jython/src/org/python/antlr/ast/IfExp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/IfExp.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/IfExp.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,19 @@ public exprType body; public exprType orelse; - public static final String[] _fields = new String[] - {"test","body","orelse"}; + private final static String[] fields = new String[] {"test", "body", + "orelse"}; + public String[] get_fields() { return fields; } + public IfExp(exprType test, exprType body, exprType orelse) { + this.test = test; + addChild(test); + this.body = body; + addChild(body); + this.orelse = orelse; + addChild(orelse); + } + public IfExp(Token token, exprType test, exprType body, exprType orelse) { super(token); this.test = test; Modified: trunk/jython/src/org/python/antlr/ast/Import.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Import.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Import.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,18 @@ public class Import extends stmtType { public aliasType[] names; - public static final String[] _fields = new String[] {"names"}; + private final static String[] fields = new String[] {"names"}; + public String[] get_fields() { return fields; } + public Import(aliasType[] names) { + this.names = names; + if (names != null) { + for(int inames=0;inames<names.length;inames++) { + addChild(names[inames]); + } + } + } + public Import(Token token, aliasType[] names) { super(token); this.names = names; Modified: trunk/jython/src/org/python/antlr/ast/ImportFrom.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ImportFrom.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ImportFrom.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,21 @@ public aliasType[] names; public int level; - public static final String[] _fields = new String[] - {"module","names","level"}; + private final static String[] fields = new String[] {"module", "names", + "level"}; + public String[] get_fields() { return fields; } + public ImportFrom(String module, aliasType[] names, int level) { + this.module = module; + this.names = names; + if (names != null) { + for(int inames=0;inames<names.length;inames++) { + addChild(names[inames]); + } + } + this.level = level; + } + public ImportFrom(Token token, String module, aliasType[] names, int level) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Index.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Index.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Index.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,14 @@ public class Index extends sliceType { public exprType value; - public static final String[] _fields = new String[] {"value"}; + private final static String[] fields = new String[] {"value"}; + public String[] get_fields() { return fields; } + public Index(exprType value) { + this.value = value; + addChild(value); + } + public Index(Token token, exprType value) { super(token); this.value = value; Modified: trunk/jython/src/org/python/antlr/ast/Interactive.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Interactive.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Interactive.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,18 @@ public class Interactive extends modType { public stmtType[] body; - public static final String[] _fields = new String[] {"body"}; + private final static String[] fields = new String[] {"body"}; + public String[] get_fields() { return fields; } + public Interactive(stmtType[] body) { + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + } + public Interactive(Token token, stmtType[] body) { super(token); this.body = body; Modified: trunk/jython/src/org/python/antlr/ast/Lambda.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Lambda.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Lambda.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,15 @@ public argumentsType args; public exprType body; - public static final String[] _fields = new String[] {"args","body"}; + private final static String[] fields = new String[] {"args", "body"}; + public String[] get_fields() { return fields; } + public Lambda(argumentsType args, exprType body) { + this.args = args; + this.body = body; + addChild(body); + } + public Lambda(Token token, argumentsType args, exprType body) { super(token); this.args = args; Modified: trunk/jython/src/org/python/antlr/ast/List.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/List.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/List.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,19 @@ public exprType[] elts; public expr_contextType ctx; - public static final String[] _fields = new String[] {"elts","ctx"}; + private final static String[] fields = new String[] {"elts", "ctx"}; + public String[] get_fields() { return fields; } + public List(exprType[] elts, expr_contextType ctx) { + this.elts = elts; + if (elts != null) { + for(int ielts=0;ielts<elts.length;ielts++) { + addChild(elts[ielts]); + } + } + this.ctx = ctx; + } + public List(Token token, exprType[] elts, expr_contextType ctx) { super(token); this.elts = elts; Modified: trunk/jython/src/org/python/antlr/ast/ListComp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ListComp.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/ListComp.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,20 @@ public exprType elt; public comprehensionType[] generators; - public static final String[] _fields = new String[] {"elt","generators"}; + private final static String[] fields = new String[] {"elt", "generators"}; + public String[] get_fields() { return fields; } + public ListComp(exprType elt, comprehensionType[] generators) { + this.elt = elt; + addChild(elt); + this.generators = generators; + if (generators != null) { + for(int igenerators=0;igenerators<generators.length;igenerators++) { + addChild(generators[igenerators]); + } + } + } + public ListComp(Token token, exprType elt, comprehensionType[] generators) { super(token); this.elt = elt; Modified: trunk/jython/src/org/python/antlr/ast/Module.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Module.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Module.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,18 @@ public class Module extends modType { public stmtType[] body; - public static final String[] _fields = new String[] {"body"}; + private final static String[] fields = new String[] {"body"}; + public String[] get_fields() { return fields; } + public Module(stmtType[] body) { + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + } + public Module(Token token, stmtType[] body) { super(token); this.body = body; Modified: trunk/jython/src/org/python/antlr/ast/Name.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Name.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Name.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,14 @@ public String id; public expr_contextType ctx; - public static final String[] _fields = new String[] {"id","ctx"}; + private final static String[] fields = new String[] {"id", "ctx"}; + public String[] get_fields() { return fields; } + public Name(String id, expr_contextType ctx) { + this.id = id; + this.ctx = ctx; + } + public Name(Token token, String id, expr_contextType ctx) { super(token); this.id = id; Modified: trunk/jython/src/org/python/antlr/ast/Num.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Num.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Num.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,13 @@ public class Num extends exprType { public Object n; - public static final String[] _fields = new String[] {"n"}; + private final static String[] fields = new String[] {"n"}; + public String[] get_fields() { return fields; } + public Num(Object n) { + this.n = n; + } + public Num(Token token, Object n) { super(token); this.n = n; Modified: trunk/jython/src/org/python/antlr/ast/Pass.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Pass.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Pass.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -8,7 +8,8 @@ public class Pass extends stmtType { - public static final String[] _fields = new String[] {}; + public Pass() { + } public Pass(Token token) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Print.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Print.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Print.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,8 +11,22 @@ public exprType[] values; public boolean nl; - public static final String[] _fields = new String[] {"dest","values","nl"}; + private final static String[] fields = new String[] {"dest", "values", + "nl"}; + public String[] get_fields() { return fields; } + public Print(exprType dest, exprType[] values, boolean nl) { + this.dest = dest; + addChild(dest); + this.values = values; + if (values != null) { + for(int ivalues=0;ivalues<values.length;ivalues++) { + addChild(values[ivalues]); + } + } + this.nl = nl; + } + public Print(Token token, exprType dest, exprType[] values, boolean nl) { super(token); this.dest = dest; Modified: trunk/jython/src/org/python/antlr/ast/Raise.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Raise.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Raise.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,8 +11,19 @@ public exprType inst; public exprType tback; - public static final String[] _fields = new String[] {"type","inst","tback"}; + private final static String[] fields = new String[] {"type", "inst", + "tback"}; + public String[] get_fields() { return fields; } + public Raise(exprType type, exprType inst, exprType tback) { + this.type = type; + addChild(type); + this.inst = inst; + addChild(inst); + this.tback = tback; + addChild(tback); + } + public Raise(Token token, exprType type, exprType inst, exprType tback) { super(token); this.type = type; Modified: trunk/jython/src/org/python/antlr/ast/Repr.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Repr.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Repr.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,14 @@ public class Repr extends exprType { public exprType value; - public static final String[] _fields = new String[] {"value"}; + private final static String[] fields = new String[] {"value"}; + public String[] get_fields() { return fields; } + public Repr(exprType value) { + this.value = value; + addChild(value); + } + public Repr(Token token, exprType value) { super(token); this.value = value; Modified: trunk/jython/src/org/python/antlr/ast/Return.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Return.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Return.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,14 @@ public class Return extends stmtType { public exprType value; - public static final String[] _fields = new String[] {"value"}; + private final static String[] fields = new String[] {"value"}; + public String[] get_fields() { return fields; } + public Return(exprType value) { + this.value = value; + addChild(value); + } + public Return(Token token, exprType value) { super(token); this.value = value; Modified: trunk/jython/src/org/python/antlr/ast/Slice.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Slice.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Slice.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,19 @@ public exprType upper; public exprType step; - public static final String[] _fields = new String[] - {"lower","upper","step"}; + private final static String[] fields = new String[] {"lower", "upper", + "step"}; + public String[] get_fields() { return fields; } + public Slice(exprType lower, exprType upper, exprType step) { + this.lower = lower; + addChild(lower); + this.upper = upper; + addChild(upper); + this.step = step; + addChild(step); + } + public Slice(Token token, exprType lower, exprType upper, exprType step) { super(token); this.lower = lower; Modified: trunk/jython/src/org/python/antlr/ast/Str.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Str.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Str.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,13 @@ public class Str extends exprType { public Object s; - public static final String[] _fields = new String[] {"s"}; + private final static String[] fields = new String[] {"s"}; + public String[] get_fields() { return fields; } + public Str(Object s) { + this.s = s; + } + public Str(Token token, Object s) { super(token); this.s = s; Modified: trunk/jython/src/org/python/antlr/ast/Subscript.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Subscript.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Subscript.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,8 +11,17 @@ public sliceType slice; public expr_contextType ctx; - public static final String[] _fields = new String[] {"value","slice","ctx"}; + private final static String[] fields = new String[] {"value", "slice", + "ctx"}; + public String[] get_fields() { return fields; } + public Subscript(exprType value, sliceType slice, expr_contextType ctx) { + this.value = value; + addChild(value); + this.slice = slice; + this.ctx = ctx; + } + public Subscript(Token token, exprType value, sliceType slice, expr_contextType ctx) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/Suite.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Suite.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Suite.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -9,8 +9,18 @@ public class Suite extends modType { public stmtType[] body; - public static final String[] _fields = new String[] {"body"}; + private final static String[] fields = new String[] {"body"}; + public String[] get_fields() { return fields; } + public Suite(stmtType[] body) { + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + } + public Suite(Token token, stmtType[] body) { super(token); this.body = body; Modified: trunk/jython/src/org/python/antlr/ast/TryExcept.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/TryExcept.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/TryExcept.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,32 @@ public excepthandlerType[] handlers; public stmtType[] orelse; - public static final String[] _fields = new String[] - {"body","handlers","orelse"}; + private final static String[] fields = new String[] {"body", "handlers", + "orelse"}; + public String[] get_fields() { return fields; } + public TryExcept(stmtType[] body, excepthandlerType[] handlers, stmtType[] + orelse) { + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.handlers = handlers; + if (handlers != null) { + for(int ihandlers=0;ihandlers<handlers.length;ihandlers++) { + addChild(handlers[ihandlers]); + } + } + this.orelse = orelse; + if (orelse != null) { + for(int iorelse=0;iorelse<orelse.length;iorelse++) { + addChild(orelse[iorelse]); + } + } + } + public TryExcept(Token token, stmtType[] body, excepthandlerType[] handlers, stmtType[] orelse) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/TryFinally.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/TryFinally.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/TryFinally.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,24 @@ public stmtType[] body; public stmtType[] finalbody; - public static final String[] _fields = new String[] {"body","finalbody"}; + private final static String[] fields = new String[] {"body", "finalbody"}; + public String[] get_fields() { return fields; } + public TryFinally(stmtType[] body, stmtType[] finalbody) { + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.finalbody = finalbody; + if (finalbody != null) { + for(int ifinalbody=0;ifinalbody<finalbody.length;ifinalbody++) { + addChild(finalbody[ifinalbody]); + } + } + } + public TryFinally(Token token, stmtType[] body, stmtType[] finalbody) { super(token); this.body = body; Modified: trunk/jython/src/org/python/antlr/ast/Tuple.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Tuple.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/Tuple.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,19 @@ public exprType[] elts; public expr_contextType ctx; - public static final String[] _fields = new String[] {"elts","ctx"}; + private final static String[] fields = new String[] {"elts", "ctx"}; + public String[] get_fields() { return fields; } + public Tuple(exprType[] elts, expr_contextType ctx) { + this.elts = elts; + if (elts != null) { + for(int ielts=0;ielts<elts.length;ielts++) { + addChild(elts[ielts]); + } + } + this.ctx = ctx; + } + public Tuple(Token token, exprType[] elts, expr_contextType ctx) { super(token); this.elts = elts; Modified: trunk/jython/src/org/python/antlr/ast/UnaryOp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/UnaryOp.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/UnaryOp.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -10,8 +10,15 @@ public unaryopType op; public exprType operand; - public static final String[] _fields = new String[] {"op","operand"}; + private final static String[] fields = new String[] {"op", "operand"}; + public String[] get_fields() { return fields; } + public UnaryOp(unaryopType op, exprType operand) { + this.op = op; + this.operand = operand; + addChild(operand); + } + public UnaryOp(Token token, unaryopType op, exprType operand) { super(token); this.op = op; Modified: trunk/jython/src/org/python/antlr/ast/While.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/While.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/While.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,27 @@ public stmtType[] body; public stmtType[] orelse; - public static final String[] _fields = new String[] - {"test","body","orelse"}; + private final static String[] fields = new String[] {"test", "body", + "orelse"}; + public String[] get_fields() { return fields; } + public While(exprType test, stmtType[] body, stmtType[] orelse) { + this.test = test; + addChild(test); + this.body = body; + if (body != null) { + for(int ibody=0;ibody<body.length;ibody++) { + addChild(body[ibody]); + } + } + this.orelse = orelse; + if (orelse != null) { + for(int iorelse=0;iorelse<orelse.length;iorelse++) { + addChild(orelse[iorelse]); + } + } + } + public While(Token token, exprType test, stmtType[] body, stmtType[] orelse) { super(token); Modified: trunk/jython/src/org/python/antlr/ast/With.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/With.java 2008-11-10 03:31:53 UTC (rev 5564) +++ trunk/jython/src/org/python/antlr/ast/With.java 2008-11-10 03:36:31 UTC (rev 5565) @@ -11,9 +11,25 @@ public exprType optional_vars; public stmtType[] body; - public static final String[] _fields = new String[] - {"context_expr","optional_vars","body"}; + private final static String[] fields = new String[] {"context_expr", + "optional_vars", + "body"}; + public String[] get_fields() { return fields; } + public With(exprType context_expr, exprType optional_vars, stmtType[] body) + ... [truncated message content] |
From: <fwi...@us...> - 2008-11-10 21:12:33
|
Revision: 5569 http://jython.svn.sourceforge.net/jython/?rev=5569&view=rev Author: fwierzbicki Date: 2008-11-10 21:12:29 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Make lineno and col_offset writable. Modified Paths: -------------- trunk/jython/ast/asdl_antlr.py trunk/jython/src/org/python/antlr/ast/Assert.java trunk/jython/src/org/python/antlr/ast/Assign.java trunk/jython/src/org/python/antlr/ast/Attribute.java trunk/jython/src/org/python/antlr/ast/AugAssign.java trunk/jython/src/org/python/antlr/ast/BinOp.java trunk/jython/src/org/python/antlr/ast/BoolOp.java trunk/jython/src/org/python/antlr/ast/Break.java trunk/jython/src/org/python/antlr/ast/Call.java trunk/jython/src/org/python/antlr/ast/ClassDef.java trunk/jython/src/org/python/antlr/ast/Compare.java trunk/jython/src/org/python/antlr/ast/Continue.java trunk/jython/src/org/python/antlr/ast/Delete.java trunk/jython/src/org/python/antlr/ast/Dict.java trunk/jython/src/org/python/antlr/ast/Exec.java trunk/jython/src/org/python/antlr/ast/Expr.java trunk/jython/src/org/python/antlr/ast/For.java trunk/jython/src/org/python/antlr/ast/FunctionDef.java trunk/jython/src/org/python/antlr/ast/GeneratorExp.java trunk/jython/src/org/python/antlr/ast/Global.java trunk/jython/src/org/python/antlr/ast/If.java trunk/jython/src/org/python/antlr/ast/IfExp.java trunk/jython/src/org/python/antlr/ast/Import.java trunk/jython/src/org/python/antlr/ast/ImportFrom.java trunk/jython/src/org/python/antlr/ast/Lambda.java trunk/jython/src/org/python/antlr/ast/List.java trunk/jython/src/org/python/antlr/ast/ListComp.java trunk/jython/src/org/python/antlr/ast/Name.java trunk/jython/src/org/python/antlr/ast/Num.java trunk/jython/src/org/python/antlr/ast/Pass.java trunk/jython/src/org/python/antlr/ast/Print.java trunk/jython/src/org/python/antlr/ast/Raise.java trunk/jython/src/org/python/antlr/ast/Repr.java trunk/jython/src/org/python/antlr/ast/Return.java trunk/jython/src/org/python/antlr/ast/Str.java trunk/jython/src/org/python/antlr/ast/Subscript.java trunk/jython/src/org/python/antlr/ast/TryExcept.java trunk/jython/src/org/python/antlr/ast/TryFinally.java trunk/jython/src/org/python/antlr/ast/Tuple.java trunk/jython/src/org/python/antlr/ast/UnaryOp.java trunk/jython/src/org/python/antlr/ast/While.java trunk/jython/src/org/python/antlr/ast/With.java trunk/jython/src/org/python/antlr/ast/Yield.java Modified: trunk/jython/ast/asdl_antlr.py =================================================================== --- trunk/jython/ast/asdl_antlr.py 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/ast/asdl_antlr.py 2008-11-10 21:12:29 UTC (rev 5569) @@ -258,16 +258,32 @@ if str(name) in ('stmt', 'expr'): # The lineno property + self.emit("private int lineno = -1;", depth + 1) self.emit("public int getLineno() {", depth + 1) + self.emit("if (lineno != -1) {", depth + 2); + self.emit("return lineno;", depth + 3); + self.emit("}", depth + 2) self.emit('return getLine();', depth + 2) self.emit("}", depth + 1) self.emit("", 0) + self.emit("public void setLineno(int num) {", depth + 1) + self.emit("lineno = num;", depth + 2); + self.emit("}", depth + 1) + self.emit("", 0) # The col_offset property + self.emit("private int col_offset = -1;", depth + 1) self.emit("public int getCol_offset() {", depth + 1) + self.emit("if (col_offset != -1) {", depth + 2); + self.emit("return col_offset;", depth + 3); + self.emit("}", depth + 2) self.emit('return getCharPositionInLine();', depth + 2) self.emit("}", depth + 1) self.emit("", 0) + self.emit("public void setCol_offset(int num) {", depth + 1) + self.emit("col_offset = num;", depth + 2); + self.emit("}", depth + 1) + self.emit("", 0) self.emit("}", depth) self.close() Modified: trunk/jython/src/org/python/antlr/ast/Assert.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Assert.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Assert.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -71,12 +71,28 @@ msg.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Assign.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Assign.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Assign.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -91,12 +91,28 @@ value.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Attribute.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Attribute.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Attribute.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -81,12 +81,28 @@ this.ctx = c; } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/AugAssign.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/AugAssign.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/AugAssign.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -83,12 +83,28 @@ value.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/BinOp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/BinOp.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/BinOp.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -81,12 +81,28 @@ right.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/BoolOp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/BoolOp.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/BoolOp.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -85,12 +85,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Break.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Break.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Break.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -40,12 +40,28 @@ public void traverse(VisitorIF visitor) throws Exception { } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Call.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Call.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Call.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -159,12 +159,28 @@ kwargs.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/ClassDef.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ClassDef.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/ClassDef.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -158,12 +158,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Compare.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Compare.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Compare.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -107,12 +107,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Continue.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Continue.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Continue.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -40,12 +40,28 @@ public void traverse(VisitorIF visitor) throws Exception { } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Delete.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Delete.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Delete.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -77,12 +77,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Dict.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Dict.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Dict.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -111,12 +111,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Exec.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Exec.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Exec.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -88,12 +88,28 @@ locals.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Expr.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Expr.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Expr.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -57,12 +57,28 @@ value.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/For.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/For.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/For.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -144,12 +144,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/FunctionDef.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/FunctionDef.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/FunctionDef.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -134,12 +134,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/GeneratorExp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/GeneratorExp.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/GeneratorExp.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -94,12 +94,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Global.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Global.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Global.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -51,12 +51,28 @@ public void traverse(VisitorIF visitor) throws Exception { } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/If.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/If.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/If.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -128,12 +128,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/IfExp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/IfExp.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/IfExp.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -88,12 +88,28 @@ orelse.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Import.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Import.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Import.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -77,12 +77,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/ImportFrom.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ImportFrom.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/ImportFrom.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -97,12 +97,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Lambda.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Lambda.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Lambda.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -67,12 +67,28 @@ body.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/List.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/List.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/List.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -89,12 +89,28 @@ this.ctx = c; } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/ListComp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/ListComp.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/ListComp.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -93,12 +93,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Name.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Name.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Name.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -63,12 +63,28 @@ this.ctx = c; } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Num.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Num.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Num.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -51,12 +51,28 @@ public void traverse(VisitorIF visitor) throws Exception { } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Pass.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Pass.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Pass.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -40,12 +40,28 @@ public void traverse(VisitorIF visitor) throws Exception { } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Print.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Print.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Print.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -102,12 +102,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Raise.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Raise.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Raise.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -88,12 +88,28 @@ tback.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Repr.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Repr.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Repr.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -57,12 +57,28 @@ value.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Return.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Return.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Return.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -57,12 +57,28 @@ value.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Str.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Str.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Str.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -51,12 +51,28 @@ public void traverse(VisitorIF visitor) throws Exception { } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Subscript.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Subscript.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Subscript.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -83,12 +83,28 @@ this.ctx = c; } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/TryExcept.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/TryExcept.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/TryExcept.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -150,12 +150,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/TryFinally.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/TryFinally.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/TryFinally.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -112,12 +112,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Tuple.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Tuple.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Tuple.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -90,12 +90,28 @@ this.ctx = c; } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/UnaryOp.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/UnaryOp.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/UnaryOp.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -65,12 +65,28 @@ operand.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/While.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/While.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/While.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -129,12 +129,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/With.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/With.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/With.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -111,12 +111,28 @@ } } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } Modified: trunk/jython/src/org/python/antlr/ast/Yield.java =================================================================== --- trunk/jython/src/org/python/antlr/ast/Yield.java 2008-11-10 15:33:23 UTC (rev 5568) +++ trunk/jython/src/org/python/antlr/ast/Yield.java 2008-11-10 21:12:29 UTC (rev 5569) @@ -57,12 +57,28 @@ value.accept(visitor); } + private int lineno = -1; public int getLineno() { + if (lineno != -1) { + return lineno; + } return getLine(); } + public void setLineno(int num) { + lineno = num; + } + + private int col_offset = -1; public int getCol_offset() { + if (col_offset != -1) { + return col_offset; + } return getCharPositionInLine(); } + public void setCol_offset(int num) { + col_offset = num; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-11-12 19:10:59
|
Revision: 5573 http://jython.svn.sourceforge.net/jython/?rev=5573&view=rev Author: fwierzbicki Date: 2008-11-12 19:10:54 +0000 (Wed, 12 Nov 2008) Log Message: ----------- Upgrade to antlr-3.1.1. Modified Paths: -------------- trunk/jython/build.xml Added Paths: ----------- trunk/jython/extlibs/antlr-3.1.1-runtime.jar trunk/jython/extlibs/antlr-3.1.1.jar Removed Paths: ------------- trunk/jython/extlibs/antlr-3.1.jar trunk/jython/extlibs/antlr-runtime-3.1.jar Modified: trunk/jython/build.xml =================================================================== --- trunk/jython/build.xml 2008-11-12 01:31:02 UTC (rev 5572) +++ trunk/jython/build.xml 2008-11-12 19:10:54 UTC (rev 5573) @@ -164,7 +164,7 @@ <pathelement path="${extlibs.dir}/mysql-connector-java-5.1.6.jar" /> <pathelement path="${extlibs.dir}/postgresql-8.3-603.jdbc4.jar" /> <pathelement path="${extlibs.dir}/antlr-2.7.7.jar" /> - <pathelement path="${extlibs.dir}/antlr-3.1.jar" /> + <pathelement path="${extlibs.dir}/antlr-3.1.1.jar" /> <pathelement path="${extlibs.dir}/stringtemplate-3.2.jar" /> </path> @@ -516,7 +516,7 @@ <target name="jarjar" depends="init,needed-check" unless="jarjar.notneeded"> <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask" classpath="extlibs/jarjar-0.7.jar"/> <jarjar destfile="${output.dir}/jarjar.jar"> - <zipfileset src="extlibs/antlr-runtime-3.1.jar"/> + <zipfileset src="extlibs/antlr-3.1.1-runtime.jar"/> <zipfileset src="extlibs/asm-3.1.jar"/> <zipfileset src="extlibs/asm-commons-3.1.jar"/> <zipfileset src="extlibs/asm-util-3.1.jar"/> Added: trunk/jython/extlibs/antlr-3.1.1-runtime.jar =================================================================== (Binary files differ) Property changes on: trunk/jython/extlibs/antlr-3.1.1-runtime.jar ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: trunk/jython/extlibs/antlr-3.1.1.jar =================================================================== (Binary files differ) Property changes on: trunk/jython/extlibs/antlr-3.1.1.jar ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Deleted: trunk/jython/extlibs/antlr-3.1.jar =================================================================== (Binary files differ) Deleted: trunk/jython/extlibs/antlr-runtime-3.1.jar =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-11-14 00:02:21
|
Revision: 5576 http://jython.svn.sourceforge.net/jython/?rev=5576&view=rev Author: pjenvey Date: 2008-11-14 00:02:12 +0000 (Fri, 14 Nov 2008) Log Message: ----------- fix itertools.chain stopping short with two empty iters in a row Modified Paths: -------------- trunk/jython/Lib/test/test_iter_jy.py trunk/jython/src/org/python/modules/itertools.java Modified: trunk/jython/Lib/test/test_iter_jy.py =================================================================== --- trunk/jython/Lib/test/test_iter_jy.py 2008-11-12 19:33:58 UTC (rev 5575) +++ trunk/jython/Lib/test/test_iter_jy.py 2008-11-14 00:02:12 UTC (rev 5576) @@ -2,6 +2,7 @@ Made for Jython. """ +import itertools from test import test_support import unittest @@ -23,7 +24,10 @@ return str(index) + '!' self.assertEqual(iter(MyStr('ab')).next(), '0!') + def test_chain(self): + self.assertEqual(list(itertools.chain([], [], ['foo'])), ['foo']) + def test_main(): test_support.run_unittest(IterTestCase) Modified: trunk/jython/src/org/python/modules/itertools.java =================================================================== --- trunk/jython/src/org/python/modules/itertools.java 2008-11-12 19:33:58 UTC (rev 5575) +++ trunk/jython/src/org/python/modules/itertools.java 2008-11-14 00:02:12 UTC (rev 5576) @@ -161,20 +161,14 @@ int iteratorIndex = 0; public PyObject __iternext__() { - if (iteratorIndex >= iterators.length) { - return null; - } - PyObject obj = nextElement(iterators[iteratorIndex]); - - if (obj == null) { - // increase the iteratorIndex and see if we have more - // iterators to work with - iteratorIndex++; - if (iteratorIndex < iterators.length) { - obj = nextElement(iterators[iteratorIndex]); + PyObject next = null; + for (; iteratorIndex < iterators.length; iteratorIndex++) { + next = nextElement(iterators[iteratorIndex]); + if (next != null) { + break; } } - return obj; + return next; } }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-11-14 07:36:05
|
Revision: 5578 http://jython.svn.sourceforge.net/jython/?rev=5578&view=rev Author: pjenvey Date: 2008-11-14 07:35:53 +0000 (Fri, 14 Nov 2008) Log Message: ----------- bring in constantine (0.3dev r80) for better errnos Modified Paths: -------------- trunk/jython/Lib/os.py trunk/jython/Lib/subprocess.py trunk/jython/Lib/test/test_chdir.py trunk/jython/Lib/test/test_fileno.py trunk/jython/build.xml trunk/jython/src/org/python/core/Py.java trunk/jython/src/org/python/core/io/FileIO.java trunk/jython/src/org/python/core/io/IOBase.java trunk/jython/src/org/python/core/io/ServerSocketIO.java trunk/jython/src/org/python/modules/_py_compile.java trunk/jython/src/org/python/modules/errno.java Added Paths: ----------- trunk/jython/extlibs/constantine.jar Modified: trunk/jython/Lib/os.py =================================================================== --- trunk/jython/Lib/os.py 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/Lib/os.py 2008-11-14 07:35:53 UTC (rev 5578) @@ -46,6 +46,7 @@ import stat as _stat import sys from java.io import File +from org.python.constantine.platform import Errno from org.python.core.io import FileDescriptors, FileIO, IOBase from org.python.core.Py import newString as asPyString @@ -101,7 +102,7 @@ err = getattr(errno, error.name(), None) if err is None: raise OSError('%s: %s' % (error, msg)) - raise OSError(err, errno.strerror(err), msg) + raise OSError(err, strerror(err), msg) def unimplementedError(self, method_name): raise NotImplementedError(method_name) def warn(self, warning_id, msg, rest): @@ -246,9 +247,9 @@ """ realpath = _path.realpath(path) if not _path.exists(realpath): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), path) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), path) if not _path.isdir(realpath): - raise OSError(errno.ENOTDIR, errno.strerror(errno.ENOTDIR), path) + raise OSError(errno.ENOTDIR, strerror(errno.ENOTDIR), path) sys.setCurrentWorkingDir(realpath) def listdir(path): @@ -275,7 +276,7 @@ # catch not found errors explicitly here, for now abs_path = sys.getPath(path) if not File(abs_path).exists(): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), path) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), path) _posix.chmod(abs_path, mode) def mkdir(path, mode='ignored'): @@ -292,7 +293,7 @@ err = errno.EEXIST else: err = 0 - msg = errno.strerror(err) if err else "couldn't make directory" + msg = strerror(err) if err else "couldn't make directory" raise OSError(err, msg, path) def makedirs(path, mode='ignored'): @@ -371,9 +372,9 @@ Remove a directory.""" f = File(sys.getPath(path)) if not f.exists(): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), path) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), path) elif not f.isDirectory(): - raise OSError(errno.ENOTDIR, errno.strerror(errno.ENOTDIR), path) + raise OSError(errno.ENOTDIR, strerror(errno.ENOTDIR), path) elif not f.delete(): raise OSError(0, "couldn't delete directory", path) @@ -409,10 +410,17 @@ """ if not isinstance(code, (int, long)): raise TypeError('an integer is required') - try: - return errno.strerror(code) - except KeyError: + constant = Errno.valueOf(code) + if constant is Errno.__UNKNOWN_CONSTANT__: return 'Unknown error: %d' % code + if constant.name() == constant.description(): + # XXX: have constantine handle this fallback + # Fake constant or just lacks a description, fallback to Linux's + from org.python.constantine.platform.linux import Errno as LinuxErrno + constant = getattr(LinuxErrno, constant.name(), None) + if not constant: + return 'Unknown error: %d' % code + return asPyString(constant.toString()) def access(path, mode): """access(path, mode) -> True if granted, False otherwise @@ -459,7 +467,7 @@ raise f = File(abs_path) if not f.exists(): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), path) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), path) size = f.length() mtime = f.lastModified() / 1000.0 mode = 0 @@ -509,7 +517,7 @@ # Not a link, only now can we determine if it exists (because # File.exists() returns False for dead links) if not f.exists(): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), path) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), path) return stat(path) def utime(path, times): @@ -550,12 +558,12 @@ if (len(mode) and mode[0] or '') not in 'rwa': raise ValueError("invalid file mode '%s'" % mode) if rawio.closed(): - raise OSError(errno.EBADF, errno.strerror(errno.EBADF)) + raise OSError(errno.EBADF, strerror(errno.EBADF)) try: fp = FileDescriptors.wrap(rawio, mode, bufsize) except IOError: - raise OSError(errno.EINVAL, errno.strerror(errno.EINVAL)) + raise OSError(errno.EINVAL, strerror(errno.EINVAL)) return fp def ftruncate(fd, length): @@ -567,7 +575,7 @@ try: rawio.truncate(length) except Exception, e: - raise IOError(errno.EBADF, errno.strerror(errno.EBADF)) + raise IOError(errno.EBADF, strerror(errno.EBADF)) def lseek(fd, pos, how): """lseek(fd, pos, how) -> newpos @@ -593,10 +601,10 @@ appending = flag & O_APPEND if updating and writing: - raise OSError(errno.EINVAL, errno.strerror(errno.EINVAL), filename) + raise OSError(errno.EINVAL, strerror(errno.EINVAL), filename) if not creating and not path.exists(filename): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), filename) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), filename) if not writing: if updating: @@ -611,7 +619,7 @@ if exclusive and creating: try: if not File(sys.getPath(filename)).createNewFile(): - raise OSError(errno.EEXIST, errno.strerror(errno.EEXIST), + raise OSError(errno.EEXIST, strerror(errno.EEXIST), filename) except java.io.IOException, ioe: raise OSError(ioe) @@ -627,8 +635,8 @@ fchannel = RandomAccessFile(sys.getPath(filename), 'rws').getChannel() except FileNotFoundException, fnfe: if path.isdir(filename): - raise OSError(errno.EISDIR, errno.strerror(errno.EISDIR)) - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), filename) + raise OSError(errno.EISDIR, strerror(errno.EISDIR)) + raise OSError(errno.ENOENT, strerror(errno.ENOENT), filename) return FileIO(fchannel, mode) return FileIO(filename, mode) @@ -659,7 +667,7 @@ try: return func(*args, **kwargs) except: - raise OSError(errno.EBADF, errno.strerror(errno.EBADF)) + raise OSError(errno.EBADF, strerror(errno.EBADF)) if _name == 'posix' and _native_posix: def link(src, dst): Modified: trunk/jython/Lib/subprocess.py =================================================================== --- trunk/jython/Lib/subprocess.py 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/Lib/subprocess.py 2008-11-14 07:35:53 UTC (rev 5578) @@ -1169,9 +1169,9 @@ if cwd is None: cwd = os.getcwd() elif not os.path.exists(cwd): - raise OSError(errno.ENOENT, errno.strerror(errno.ENOENT), cwd) + raise OSError(errno.ENOENT, os.strerror(errno.ENOENT), cwd) elif not os.path.isdir(cwd): - raise OSError(errno.ENOTDIR, errno.strerror(errno.ENOENT), cwd) + raise OSError(errno.ENOTDIR, os.strerror(errno.ENOENT), cwd) builder.directory(java.io.File(cwd)) # Let Java manage redirection of stderr to stdout (it's more Modified: trunk/jython/Lib/test/test_chdir.py =================================================================== --- trunk/jython/Lib/test/test_chdir.py 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/Lib/test/test_chdir.py 2008-11-14 07:35:53 UTC (rev 5578) @@ -177,10 +177,11 @@ def test_invalid_chdir(self): raises(OSError, - '[Errno 2] No such file or directory: %r' % self.filename1, + '[Errno 2] %s: %r' % (os.strerror(2), self.filename1), os.chdir, self.filename1) open(self.filename1, 'w').close() - raises(OSError, '[Errno 20] Not a directory: %r' % self.filename1, + raises(OSError, + '[Errno 20] %s: %r' % (os.strerror(20), self.filename1), os.chdir, self.filename1) Modified: trunk/jython/Lib/test/test_fileno.py =================================================================== --- trunk/jython/Lib/test/test_fileno.py 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/Lib/test/test_fileno.py 2008-11-14 07:35:53 UTC (rev 5578) @@ -31,8 +31,7 @@ self.assertEqual(os.path.getsize(self.filename), 0) self.fp.close() - raises(IOError, '[Errno 9] Bad file descriptor', - os.ftruncate, self.fd, 0) + raises(IOError, 9, os.ftruncate, self.fd, 0) def test_lseek(self): self.assertEqual(os.lseek(self.fd, 0, 1), 0) @@ -40,8 +39,7 @@ os.lseek(self.fd, 7, 0) self.assertEqual(os.read(self.fd, 7), 'filenos') self.fp.close() - raises(OSError, '[Errno 9] Bad file descriptor', - os.lseek, self.fd, 0, 1) + raises(OSError, 9, os.lseek, self.fd, 0, 1) def test_read(self): self.fp.write('jython filenos') @@ -50,16 +48,14 @@ self.assertEqual(os.read(self.fd, 7), 'jython ') self.assertEqual(os.read(self.fd, 99), 'filenos') self.fp.close() - raises(OSError, '[Errno 9] Bad file descriptor', - os.read, self.fd, 1) + raises(OSError, 9, os.read, self.fd, 1) def test_write(self): os.write(self.fd, 'jython filenos') self.fp.seek(0) self.assertEqual(self.fp.read(), 'jython filenos') self.fp.close() - raises(OSError, '[Errno 9] Bad file descriptor', - os.write, self.fd, 'The Larch') + raises(OSError, 9, os.write, self.fd, 'The Larch') class TestOsOpenTestCase(unittest.TestCase): @@ -96,8 +92,7 @@ # falls back to read only without O_WRONLY/O_RDWR self.fd = os.open(self.filename, os.O_APPEND) - raises(OSError, '[Errno 9] Bad file descriptor', - os.write, self.fd, 'new') + raises(OSError, 9, os.write, self.fd, 'new') # Acts as append on windows (seeks to the end) os.lseek(self.fd, 0, 0) self.assertEquals(os.read(self.fd, len('jython filenos')), 'jython filenos') @@ -105,8 +100,7 @@ # falls back to read only without O_WRONLY/O_RDWR self.fd = os.open(self.filename, os.O_CREAT) - raises(OSError, '[Errno 9] Bad file descriptor', - os.write, self.fd, 'new') + raises(OSError, 9, os.write, self.fd, 'new') self.assertEquals(os.read(self.fd, len('jython filenos')), 'jython filenos') os.close(self.fd) @@ -133,8 +127,7 @@ self.fd = os.open(self.filename, os.O_TRUNC | os.O_WRONLY) self.assertEquals(os.path.getsize(self.filename), 0) os.write(self.fd, 'write only truncated') - raises(OSError, '[Errno 9] Bad file descriptor', - os.read, self.fd, 99) + raises(OSError, 9, os.read, self.fd, 99) os.close(self.fd) fd = open(self.filename) @@ -146,8 +139,7 @@ # falls back to read only without O_WRONLY/O_RDWR, but truncates self.fd = os.open(self.filename, os.O_TRUNC) self.assertEquals(os.path.getsize(self.filename), 0) - raises(OSError, '[Errno 9] Bad file descriptor', - os.write, self.fd, 'new') + raises(OSError, 9, os.write, self.fd, 'new') self.assertEquals(os.read(self.fd, 99), '') os.close(self.fd) @@ -159,8 +151,7 @@ # append with no write falls back to read, but still truncates self.fd = os.open(self.filename, os.O_TRUNC | os.O_APPEND) self.assertEquals(os.path.getsize(self.filename), 0) - raises(OSError, '[Errno 9] Bad file descriptor', - os.write, self.fd, 'new') + raises(OSError, 9, os.write, self.fd, 'new') os.close(self.fd) fp = open(self.filename, 'w') @@ -172,26 +163,23 @@ def test_open_exclusive(self): self.assert_(not os.path.exists(self.filename)) # fails without O_CREAT - raises(OSError, '[Errno 2] No such file or directory: %r' % \ - self.filename, - os.open, self.filename, os.O_EXCL) + raises(OSError, (2, self.filename), os.open, self.filename, os.O_EXCL) self.assert_(not os.path.exists(self.filename)) # creates, read only self.fd = os.open(self.filename, os.O_EXCL | os.O_CREAT) self.assert_(os.path.exists(self.filename)) - raises(OSError, '[Errno 9] Bad file descriptor', - os.write, self.fd, 'jython') + raises(OSError, 9, os.write, self.fd, 'jython') self.assertEquals(os.read(self.fd, 99), '') os.close(self.fd) # not exclusive unless creating os.close(os.open(self.filename, os.O_EXCL)) - raises(OSError, '[Errno 17] File exists: %r' % self.filename, + raises(OSError, (17, self.filename), os.open, self.filename, os.O_CREAT | os.O_EXCL) - raises(OSError, '[Errno 17] File exists: %r' % self.filename, + raises(OSError, (17, self.filename), os.open, self.filename, os.O_CREAT | os.O_WRONLY | os.O_EXCL) - raises(OSError, '[Errno 17] File exists: %r' % self.filename, + raises(OSError, (17, self.filename), os.open, self.filename, os.O_CREAT | os.O_RDWR | os.O_EXCL) os.remove(self.filename) @@ -208,8 +196,7 @@ self.fd = os.open(self.filename, os.O_SYNC | os.O_WRONLY | os.O_CREAT) self.assert_(os.path.exists(self.filename)) os.write(self.fd, 'jython') - raises(OSError, '[Errno 9] Bad file descriptor', - os.read, self.fd, 99) + raises(OSError, 9, os.read, self.fd, 99) os.close(self.fd) os.remove(self.filename) @@ -232,12 +219,11 @@ def test_bad_open(self): for mode in (os.O_WRONLY, os.O_WRONLY, os.O_RDWR): - raises(OSError, '[Errno 2] No such file or directory: %r' % \ - self.filename, os.open, self.filename, mode) + raises(OSError, (2, self.filename), os.open, self.filename, mode) open(self.filename, 'w').close() - raises(OSError, '[Errno 22] Invalid argument: %r' % self.filename, + raises(OSError, (22, self.filename), os.open, self.filename, os.O_WRONLY | os.O_RDWR) @@ -321,12 +307,26 @@ def raises(exc, expected, callable, *args): + """Ensure the specified call raises exc. + + expected is compared against the exception message if not None. It + can be a str, an errno or a 2 item tuple of errno/filename. The + latter two being for comparison against EnvironmentErrors. + """ + if expected: + if isinstance(expected, str): + msg = expected + else: + errno = expected[0] if isinstance(expected, tuple) else expected + msg = '[Errno %d] %s' % (errno, os.strerror(errno)) + if isinstance(expected, tuple): + msg += ': %r' % expected[1] try: callable(*args) - except exc, msg: - if expected is not None and str(msg) != expected: + except exc, val: + if expected and str(val) != msg: raise test_support.TestFailed( - "Message %r, expected %r" % (str(msg), expected)) + "Message %r, expected %r" % (str(value), msg)) else: raise test_support.TestFailed("Expected %s" % exc) Modified: trunk/jython/build.xml =================================================================== --- trunk/jython/build.xml 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/build.xml 2008-11-14 07:35:53 UTC (rev 5578) @@ -525,6 +525,8 @@ <zipfileset src="extlibs/jna-posix.jar"/> <!-- <rule pattern="com.sun.jna.**" result="org.python.jna.@1"/> --> <rule pattern="org.jruby.ext.posix.**" result="org.python.posix.@1"/> + <zipfileset src="extlibs/constantine.jar"/> + <rule pattern="com.kenai.constantine.**" result="org.python.constantine.@1"/> </jarjar> <unjar src="${output.dir}/jarjar.jar" dest="${jarjar.dir}"> <patternset> Added: trunk/jython/extlibs/constantine.jar =================================================================== (Binary files differ) Property changes on: trunk/jython/extlibs/constantine.jar ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/jython/src/org/python/core/Py.java =================================================================== --- trunk/jython/src/org/python/core/Py.java 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/src/org/python/core/Py.java 2008-11-14 07:35:53 UTC (rev 5578) @@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -22,11 +23,11 @@ import java.util.Set; import org.python.antlr.ast.modType; +import org.python.constantine.platform.Errno; import org.python.compiler.Module; import org.python.core.adapter.ClassicPyObjectAdapter; import org.python.core.adapter.ExtensiblePyObjectAdapter; import org.python.core.util.StringUtil; -import org.python.modules.errno; public final class Py { @@ -144,14 +145,15 @@ } public static PyObject IOError; - public static PyException IOError(java.io.IOException ioe) { + public static PyException IOError(IOException ioe) { String message = ioe.getMessage(); if (message == null) { message = ioe.getClass().getName(); } - if (ioe instanceof java.io.FileNotFoundException) { - message = "File not found - " + message; - return IOError(errno.ENOENT, message); + if (ioe instanceof FileNotFoundException) { + PyTuple args = new PyTuple(Py.newInteger(Errno.ENOENT.value()), + Py.newString("File not found - " + message)); + return new PyException(Py.IOError, args); } return new PyException(Py.IOError, message); } @@ -160,10 +162,18 @@ return new PyException(Py.IOError, message); } - public static PyException IOError(int errno, String message) { - PyTuple args = new PyTuple(new PyInteger(errno), new PyString(message)); + public static PyException IOError(Errno errno) { + PyObject args = new PyTuple(Py.newInteger(errno.value()), + Py.newString(errno.description())); return new PyException(Py.IOError, args); } + + public static PyException IOError(Errno errno, String filename) { + PyObject args = new PyTuple(Py.newInteger(errno.value()), + Py.newString(errno.description()), Py.newString(filename)); + return new PyException(Py.IOError, args); + } + public static PyObject KeyError; public static PyException KeyError(String message) { Modified: trunk/jython/src/org/python/core/io/FileIO.java =================================================================== --- trunk/jython/src/org/python/core/io/FileIO.java 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/src/org/python/core/io/FileIO.java 2008-11-14 07:35:53 UTC (rev 5578) @@ -12,11 +12,11 @@ import java.nio.channels.Channels; import java.nio.channels.FileChannel; +import org.python.constantine.platform.Errno; import org.python.core.imp; import org.python.core.Py; import org.python.core.PyObject; import org.python.core.util.RelativeFile; -import org.python.modules.errno; /** * Raw I/O implementation for OS files. @@ -67,13 +67,13 @@ fileChannel = file.getChannel(); } catch (FileNotFoundException fnfe) { if (fullPath.isDirectory()) { - throw Py.IOError(errno.EISDIR, "Is a directory"); + throw Py.IOError(Errno.EISDIR, name); } if ((writing && !fullPath.canWrite()) || fnfe.getMessage().endsWith("(Permission denied)")) { - throw Py.IOError(errno.EACCES, "Permission denied: '" + name + "'"); + throw Py.IOError(Errno.EACCES, name); } - throw Py.IOError(errno.ENOENT, "No such file or directory: '" + name + "'"); + throw Py.IOError(Errno.ENOENT, name); } initPosition(); @@ -289,7 +289,7 @@ pos += fileChannel.size(); break; default: - throw Py.IOError(errno.EINVAL, "invalid whence value"); + throw Py.IOError(Errno.EINVAL); } fileChannel.position(pos); return pos; Modified: trunk/jython/src/org/python/core/io/IOBase.java =================================================================== --- trunk/jython/src/org/python/core/io/IOBase.java 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/src/org/python/core/io/IOBase.java 2008-11-14 07:35:53 UTC (rev 5578) @@ -1,9 +1,9 @@ /* Copyright (c) 2007 Jython Developers */ package org.python.core.io; +import org.python.constantine.platform.Errno; import org.python.core.Py; import org.python.core.PyException; -import org.python.modules.errno; /** * Base class for all I/O classes. @@ -148,7 +148,7 @@ */ public void checkReadable() { if (!readable()) { - throw Py.IOError(errno.EBADF, "Bad file descriptor"); + throw Py.IOError(Errno.EBADF); } } @@ -167,7 +167,7 @@ */ public void checkWritable() { if (!writable()) { - throw Py.IOError(errno.EBADF, "Bad file descriptor"); + throw Py.IOError(Errno.EBADF); } } Modified: trunk/jython/src/org/python/core/io/ServerSocketIO.java =================================================================== --- trunk/jython/src/org/python/core/io/ServerSocketIO.java 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/src/org/python/core/io/ServerSocketIO.java 2008-11-14 07:35:53 UTC (rev 5578) @@ -6,8 +6,8 @@ import java.nio.channels.Channel; import java.nio.channels.ServerSocketChannel; +import org.python.constantine.platform.Errno; import org.python.core.Py; -import org.python.modules.errno; /** * Raw I/O implementation for server sockets. @@ -34,14 +34,14 @@ public int readinto(ByteBuffer buf) { checkClosed(); checkReadable(); - throw Py.IOError(errno.ENOTCONN, "Socket is not connected"); + throw Py.IOError(Errno.ENOTCONN); } /** {@inheritDoc} */ public int write(ByteBuffer buf) { checkClosed(); checkWritable(); - throw Py.IOError(errno.EBADF, "Bad file descriptor"); + throw Py.IOError(Errno.EBADF); } /** {@inheritDoc} */ Modified: trunk/jython/src/org/python/modules/_py_compile.java =================================================================== --- trunk/jython/src/org/python/modules/_py_compile.java 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/src/org/python/modules/_py_compile.java 2008-11-14 07:35:53 UTC (rev 5578) @@ -3,6 +3,7 @@ import java.io.File; +import org.python.constantine.platform.Errno; import org.python.core.Py; import org.python.core.PyList; import org.python.core.PyString; @@ -20,7 +21,7 @@ File file = new File(filename); if (!file.exists()) { - throw Py.IOError(errno.ENOENT, "No such file or directory: '" + filename + "'"); + throw Py.IOError(Errno.ENOENT, filename); } String name = file.getName(); int dot = name.lastIndexOf('.'); Modified: trunk/jython/src/org/python/modules/errno.java =================================================================== --- trunk/jython/src/org/python/modules/errno.java 2008-11-14 00:28:42 UTC (rev 5577) +++ trunk/jython/src/org/python/modules/errno.java 2008-11-14 07:35:53 UTC (rev 5578) @@ -1,288 +1,63 @@ +/* Copyright (c) Jython Developers */ package org.python.modules; -import org.python.core.*; +import org.python.constantine.Constant; +import org.python.constantine.ConstantSet; +import org.python.core.ClassDictInit; +import org.python.core.Py; +import org.python.core.PyDictionary; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.imp; /** - * This file contains autogenerated error codes from:<br/> - * <b>Python 2.2.1 (#5, Oct 7 2002, 09:20:38) [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-97)]</b> + * The Python errno module. * - * @author brian zimmer - * @version 2.2.1 - * @copyright 2002 brian zimmer + * Errno constants can be accessed from Java code via + * {@link org.python.constantine.platform.Errno}, e.g. Errno.ENOENT. */ -public final class errno implements ClassDictInit { +public class errno implements ClassDictInit { - private errno() {} + public static final PyString __doc__ = Py.newString( + "This module makes available standard errno system symbols.\n\n" + + "The value of each symbol is the corresponding integer value,\n" + + "e.g., on most systems, errno.ENOENT equals the integer 2.\n\n" + + "The dictionary errno.errorcode maps numeric codes to symbol names,\n" + + "e.g., errno.errorcode[2] could be the string 'ENOENT'.\n\n" + + "Symbols that are not relevant to the underlying system are not defined.\n\n" + + "To map error codes to error messages, use the function os.strerror(),\n" + + "e.g. os.strerror(2) could return 'No such file or directory'."); - public static final int EPERM = 1; - public static final int ENOENT = 2; - public static final int ESRCH = 3; - public static final int EINTR = 4; - public static final int EIO = 5; - public static final int ENXIO = 6; - public static final int E2BIG = 7; - public static final int ENOEXEC = 8; - public static final int EBADF = 9; - public static final int ECHILD = 10; - public static final int EAGAIN = 11; - public static final int EWOULDBLOCK = 11; - public static final int ENOMEM = 12; - public static final int EACCES = 13; - public static final int EFAULT = 14; - public static final int ENOTBLK = 15; - public static final int EBUSY = 16; - public static final int EEXIST = 17; - public static final int EXDEV = 18; - public static final int ENODEV = 19; - public static final int ENOTDIR = 20; - public static final int EISDIR = 21; - public static final int EINVAL = 22; - public static final int ENFILE = 23; - public static final int EMFILE = 24; - public static final int ENOTTY = 25; - public static final int ETXTBSY = 26; - public static final int EFBIG = 27; - public static final int ENOSPC = 28; - public static final int ESPIPE = 29; - public static final int EROFS = 30; - public static final int EMLINK = 31; - public static final int EPIPE = 32; - public static final int EDOM = 33; - public static final int ERANGE = 34; - public static final int EDEADLK = 35; - public static final int EDEADLOCK = 35; - public static final int ENAMETOOLONG = 36; - public static final int ENOLCK = 37; - public static final int ENOSYS = 38; - public static final int ENOTEMPTY = 39; - public static final int ELOOP = 40; - public static final int ENOMSG = 42; - public static final int EIDRM = 43; - public static final int ECHRNG = 44; - public static final int EL2NSYNC = 45; - public static final int EL3HLT = 46; - public static final int EL3RST = 47; - public static final int ELNRNG = 48; - public static final int EUNATCH = 49; - public static final int ENOCSI = 50; - public static final int EL2HLT = 51; - public static final int EBADE = 52; - public static final int EBADR = 53; - public static final int EXFULL = 54; - public static final int ENOANO = 55; - public static final int EBADRQC = 56; - public static final int EBADSLT = 57; - public static final int EBFONT = 59; - public static final int ENOSTR = 60; - public static final int ENODATA = 61; - public static final int ETIME = 62; - public static final int ENOSR = 63; - public static final int ENONET = 64; - public static final int ENOPKG = 65; - public static final int EREMOTE = 66; - public static final int ENOLINK = 67; - public static final int EADV = 68; - public static final int ESRMNT = 69; - public static final int ECOMM = 70; - public static final int EPROTO = 71; - public static final int EMULTIHOP = 72; - public static final int EDOTDOT = 73; - public static final int EBADMSG = 74; - public static final int EOVERFLOW = 75; - public static final int ENOTUNIQ = 76; - public static final int EBADFD = 77; - public static final int EREMCHG = 78; - public static final int ELIBACC = 79; - public static final int ELIBBAD = 80; - public static final int ELIBSCN = 81; - public static final int ELIBMAX = 82; - public static final int ELIBEXEC = 83; - public static final int EILSEQ = 84; - public static final int ERESTART = 85; - public static final int ESTRPIPE = 86; - public static final int EUSERS = 87; - public static final int ENOTSOCK = 88; - public static final int EDESTADDRREQ = 89; - public static final int EMSGSIZE = 90; - public static final int EPROTOTYPE = 91; - public static final int ENOPROTOOPT = 92; - public static final int EPROTONOSUPPORT = 93; - public static final int ESOCKTNOSUPPORT = 94; - public static final int EOPNOTSUPP = 95; - public static final int EPFNOSUPPORT = 96; - public static final int EAFNOSUPPORT = 97; - public static final int EADDRINUSE = 98; - public static final int EADDRNOTAVAIL = 99; - public static final int ENETDOWN = 100; - public static final int ENETUNREACH = 101; - public static final int ENETRESET = 102; - public static final int ECONNABORTED = 103; - public static final int ECONNRESET = 104; - public static final int ENOBUFS = 105; - public static final int EISCONN = 106; - public static final int ENOTCONN = 107; - public static final int ESHUTDOWN = 108; - public static final int ETOOMANYREFS = 109; - public static final int ETIMEDOUT = 110; - public static final int ECONNREFUSED = 111; - public static final int EHOSTDOWN = 112; - public static final int EHOSTUNREACH = 113; - public static final int EALREADY = 114; - public static final int EINPROGRESS = 115; - public static final int ESTALE = 116; - public static final int EUCLEAN = 117; - public static final int ENOTNAM = 118; - public static final int ENAVAIL = 119; - public static final int EISNAM = 120; - public static final int EREMOTEIO = 121; - public static final int EDQUOT = 122; - - // AMAK: Starting a new series of jython specific error numbers - public static final int ESOCKISBLOCKING = 20000; - public static final int EGETADDRINFOFAILED = 20001; - + /** Reverse mapping of codes to names. */ public static final PyObject errorcode = new PyDictionary(); - private static final PyObject strerror = new PyDictionary(); - public static void classDictInit(PyObject dict) throws PyIgnoreMethodTag { - addcode(dict, EPERM, "EPERM", "Operation not permitted"); - addcode(dict, ENOENT, "ENOENT", "No such file or directory"); - addcode(dict, ESRCH, "ESRCH", "No such process"); - addcode(dict, EINTR, "EINTR", "Interrupted system call"); - addcode(dict, EIO, "EIO", "Input/output error"); - addcode(dict, ENXIO, "ENXIO", "Device not configured"); - addcode(dict, E2BIG, "E2BIG", "Argument list too long"); - addcode(dict, ENOEXEC, "ENOEXEC", "Exec format error"); - addcode(dict, EBADF, "EBADF", "Bad file descriptor"); - addcode(dict, ECHILD, "ECHILD", "No child processes"); - addcode(dict, EAGAIN, "EAGAIN", "Resource temporarily unavailable"); - addcode(dict, EWOULDBLOCK, "EWOULDBLOCK", "Resource temporarily unavailable"); - addcode(dict, ENOMEM, "ENOMEM", "Cannot allocate memory"); - addcode(dict, EACCES, "EACCES", "Permission denied"); - addcode(dict, EFAULT, "EFAULT", "Bad address"); - addcode(dict, ENOTBLK, "ENOTBLK", "Block device required"); - addcode(dict, EBUSY, "EBUSY", "Device or resource busy"); - addcode(dict, EEXIST, "EEXIST", "File exists"); - addcode(dict, EXDEV, "EXDEV", "Invalid cross-device link"); - addcode(dict, ENODEV, "ENODEV", "No such device"); - addcode(dict, ENOTDIR, "ENOTDIR", "Not a directory"); - addcode(dict, EISDIR, "EISDIR", "Is a directory"); - addcode(dict, EINVAL, "EINVAL", "Invalid argument"); - addcode(dict, ENFILE, "ENFILE", "Too many open files in system"); - addcode(dict, EMFILE, "EMFILE", "Too many open files"); - addcode(dict, ENOTTY, "ENOTTY", "Inappropriate ioctl for device"); - addcode(dict, ETXTBSY, "ETXTBSY", "Text file busy"); - addcode(dict, EFBIG, "EFBIG", "File too large"); - addcode(dict, ENOSPC, "ENOSPC", "No space left on device"); - addcode(dict, ESPIPE, "ESPIPE", "Illegal seek"); - addcode(dict, EROFS, "EROFS", "Read-only file system"); - addcode(dict, EMLINK, "EMLINK", "Too many links"); - addcode(dict, EPIPE, "EPIPE", "Broken pipe"); - addcode(dict, EDOM, "EDOM", "Numerical argument out of domain"); - addcode(dict, ERANGE, "ERANGE", "Numerical result out of range"); - addcode(dict, EDEADLK, "EDEADLK", "Resource deadlock avoided"); - addcode(dict, EDEADLOCK, "EDEADLOCK", "Resource deadlock avoided"); - addcode(dict, ENAMETOOLONG, "ENAMETOOLONG", "File name too long"); - addcode(dict, ENOLCK, "ENOLCK", "No locks available"); - addcode(dict, ENOSYS, "ENOSYS", "Function not implemented"); - addcode(dict, ENOTEMPTY, "ENOTEMPTY", "Directory not empty"); - addcode(dict, ELOOP, "ELOOP", "Too many levels of symbolic links"); - addcode(dict, ENOMSG, "ENOMSG", "No message of desired type"); - addcode(dict, EIDRM, "EIDRM", "Identifier removed"); - addcode(dict, ECHRNG, "ECHRNG", "Channel number out of range"); - addcode(dict, EL2NSYNC, "EL2NSYNC", "Level 2 not synchronized"); - addcode(dict, EL3HLT, "EL3HLT", "Level 3 halted"); - addcode(dict, EL3RST, "EL3RST", "Level 3 reset"); - addcode(dict, ELNRNG, "ELNRNG", "Link number out of range"); - addcode(dict, EUNATCH, "EUNATCH", "Protocol driver not attached"); - addcode(dict, ENOCSI, "ENOCSI", "No CSI structure available"); - addcode(dict, EL2HLT, "EL2HLT", "Level 2 halted"); - addcode(dict, EBADE, "EBADE", "Invalid exchange"); - addcode(dict, EBADR, "EBADR", "Invalid request descriptor"); - addcode(dict, EXFULL, "EXFULL", "Exchange full"); - addcode(dict, ENOANO, "ENOANO", "No anode"); - addcode(dict, EBADRQC, "EBADRQC", "Invalid request code"); - addcode(dict, EBADSLT, "EBADSLT", "Invalid slot"); - addcode(dict, EBFONT, "EBFONT", "Bad font file format"); - addcode(dict, ENOSTR, "ENOSTR", "Device not a stream"); - addcode(dict, ENODATA, "ENODATA", "No data available"); - addcode(dict, ETIME, "ETIME", "Timer expired"); - addcode(dict, ENOSR, "ENOSR", "Out of streams resources"); - addcode(dict, ENONET, "ENONET", "Machine is not on the network"); - addcode(dict, ENOPKG, "ENOPKG", "Package not installed"); - addcode(dict, EREMOTE, "EREMOTE", "Object is remote"); - addcode(dict, ENOLINK, "ENOLINK", "Link has been severed"); - addcode(dict, EADV, "EADV", "Advertise error"); - addcode(dict, ESRMNT, "ESRMNT", "Srmount error"); - addcode(dict, ECOMM, "ECOMM", "Communication error on send"); - addcode(dict, EPROTO, "EPROTO", "Protocol error"); - addcode(dict, EMULTIHOP, "EMULTIHOP", "Multihop attempted"); - addcode(dict, EDOTDOT, "EDOTDOT", "RFS specific error"); - addcode(dict, EBADMSG, "EBADMSG", "Bad message"); - addcode(dict, EOVERFLOW, "EOVERFLOW", "Value too large for defined data type"); - addcode(dict, ENOTUNIQ, "ENOTUNIQ", "Name not unique on network"); - addcode(dict, EBADFD, "EBADFD", "File descriptor in bad state"); - addcode(dict, EREMCHG, "EREMCHG", "Remote address changed"); - addcode(dict, ELIBACC, "ELIBACC", "Can not access a needed shared library"); - addcode(dict, ELIBBAD, "ELIBBAD", "Accessing a corrupted shared library"); - addcode(dict, ELIBSCN, "ELIBSCN", ".lib section in a.out corrupted"); - addcode(dict, ELIBMAX, "ELIBMAX", "Attempting to link in too many shared libraries"); - addcode(dict, ELIBEXEC, "ELIBEXEC", "Cannot exec a shared library directly"); - addcode(dict, EILSEQ, "EILSEQ", "Invalid or incomplete multibyte or wide character"); - addcode(dict, ERESTART, "ERESTART", "Interrupted system call should be restarted"); - addcode(dict, ESTRPIPE, "ESTRPIPE", "Streams pipe error"); - addcode(dict, EUSERS, "EUSERS", "Too many users"); - addcode(dict, ENOTSOCK, "ENOTSOCK", "Socket operation on non-socket"); - addcode(dict, EDESTADDRREQ, "EDESTADDRREQ", "Destination address required"); - addcode(dict, EMSGSIZE, "EMSGSIZE", "Message too long"); - addcode(dict, EPROTOTYPE, "EPROTOTYPE", "Protocol wrong type for socket"); - addcode(dict, ENOPROTOOPT, "ENOPROTOOPT", "Protocol not available"); - addcode(dict, EPROTONOSUPPORT, "EPROTONOSUPPORT", "Protocol not supported"); - addcode(dict, ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT", "Socket type not supported"); - addcode(dict, EOPNOTSUPP, "EOPNOTSUPP", "Operation not supported"); - addcode(dict, EPFNOSUPPORT, "EPFNOSUPPORT", "Protocol family not supported"); - addcode(dict, EAFNOSUPPORT, "EAFNOSUPPORT", "Address family not supported by protocol"); - addcode(dict, EADDRINUSE, "EADDRINUSE", "Address already in use"); - addcode(dict, EADDRNOTAVAIL, "EADDRNOTAVAIL", "Cannot assign requested address"); - addcode(dict, ENETDOWN, "ENETDOWN", "Network is down"); - addcode(dict, ENETUNREACH, "ENETUNREACH", "Network is unreachable"); - addcode(dict, ENETRESET, "ENETRESET", "Network dropped connection on reset"); - addcode(dict, ECONNABORTED, "ECONNABORTED", "Software caused connection abort"); - addcode(dict, ECONNRESET, "ECONNRESET", "Connection reset by peer"); - addcode(dict, ENOBUFS, "ENOBUFS", "No buffer space available"); - addcode(dict, EISCONN, "EISCONN", "Transport endpoint is already connected"); - addcode(dict, ENOTCONN, "ENOTCONN", "Transport endpoint is not connected"); - addcode(dict, ESHUTDOWN, "ESHUTDOWN", "Cannot send after transport endpoint shutdown"); - addcode(dict, ETOOMANYREFS, "ETOOMANYREFS", "Too many references: cannot splice"); - addcode(dict, ETIMEDOUT, "ETIMEDOUT", "Connection timed out"); - addcode(dict, ECONNREFUSED, "ECONNREFUSED", "Connection refused"); - addcode(dict, EHOSTDOWN, "EHOSTDOWN", "Host is down"); - addcode(dict, EHOSTUNREACH, "EHOSTUNREACH", "No route to host"); - addcode(dict, EALREADY, "EALREADY", "Operation already in progress"); - addcode(dict, EINPROGRESS, "EINPROGRESS", "Operation now in progress"); - addcode(dict, ESTALE, "ESTALE", "Stale NFS file handle"); - addcode(dict, EUCLEAN, "EUCLEAN", "Structure needs cleaning"); - addcode(dict, ENOTNAM, "ENOTNAM", "Not a XENIX named type file"); - addcode(dict, ENAVAIL, "ENAVAIL", "No XENIX semaphores available"); - addcode(dict, EISNAM, "EISNAM", "Is a named type file"); - addcode(dict, EREMOTEIO, "EREMOTEIO", "Remote I/O error"); - addcode(dict, EDQUOT, "EDQUOT", "Disk quota exceeded"); + public static void classDictInit(PyObject dict) { + for (Constant constant : ConstantSet.getConstantSet("Errno")) { + addCode(dict, constant.name(), constant.value(), constant.toString()); + } + // XXX: necessary? + addCode(dict, "ESOCKISBLOCKING", 20000, "Socket is in blocking mode"); + addCode(dict, "EGETADDRINFOFAILED", 20001, "getaddrinfo failed"); - // AMAK: starting a new series of jython specific errors - addcode(dict, ESOCKISBLOCKING, "ESOCKISBLOCKING", "Socket is in blocking mode"); - addcode(dict, EGETADDRINFOFAILED, "EGETADDRINFOFAILED", "getaddrinfo failed"); + // Hide from Python + dict.__setitem__("classDictInit", null); } - public static PyObject strerror(PyObject error) { - return strerror.__getitem__(error); + private static void addCode(PyObject dict, String name, int code, String message) { + PyObject nameObj = Py.newString(name); + PyObject codeObj = Py.newInteger(code); + dict.__setitem__(nameObj, codeObj); + errorcode.__setitem__(codeObj, nameObj); } - private static void addcode(PyObject dict, int errno, - String err, String msg) { - PyObject errno_o = Py.newInteger(errno); - PyObject err_o = Py.newString(err); - strerror.__setitem__(errno_o, Py.newString(msg)); - errorcode.__setitem__(errno_o, err_o); - dict.__setitem__(err_o, errno_o); + /** + * @deprecated Use org.python.core.constantine.Errno.valueOf(code).toString() (or + * os.strerror from Python) instead. + */ + @Deprecated + public static PyObject strerror(PyObject code) { + Py.warning(Py.DeprecationWarning, + "The errno.strerror function is deprecated, use os.strerror."); + return imp.load("os").__getattr__("strerror").__call__(code); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2008-11-14 22:54:58
|
Revision: 5581 http://jython.svn.sourceforge.net/jython/?rev=5581&view=rev Author: fwierzbicki Date: 2008-11-14 22:54:53 +0000 (Fri, 14 Nov 2008) Log Message: ----------- Fix for http://bugs.jython.org/issue1141. __builtin__.__import__ had subtle differences with CPython. These differences would cause problems for those who wish to override __builtin__.__import__ statement: import hell.first_circle - CPython: ('hell.first_circle', None) - old Jython: ('hell.first_circle', ()) statement: import hell.first_circle as limbo - CPython: ('hell.first_circle', None) - old Jython: ('hell.first_circle', ('*',)) Also note that the second import statement with an "as" would return the head module instead of the tail module, the opposite of what CPython does. Modified Paths: -------------- trunk/jython/Lib/test/test_import_jy.py trunk/jython/src/org/python/core/__builtin__.java trunk/jython/src/org/python/core/imp.java Modified: trunk/jython/Lib/test/test_import_jy.py =================================================================== --- trunk/jython/Lib/test/test_import_jy.py 2008-11-14 17:53:21 UTC (rev 5580) +++ trunk/jython/Lib/test/test_import_jy.py 2008-11-14 22:54:53 UTC (rev 5581) @@ -96,9 +96,46 @@ self.assertEquals(bytecode, read(init_compiled), 'bytecode was recompiled') +class OverrideBuiltinsImportTestCase(unittest.TestCase): + def test_override(self): + tests = [ + ("import os.path" , "('os.path', None, -1, 'os')" ), + ("import os.path as path2", "('os.path', None, -1, 'os')" ), + ("from os.path import *" , "('os.path', ('*',), -1, 'posixpath')"), + ("from os.path import join", + "('os.path', ('join',), -1, 'posixpath')"), + ("from os.path import join as join2", + "('os.path', ('join',), -1, 'posixpath')"), + ("from os.path import join as join2, split as split2", + "('os.path', ('join', 'split'), -1, 'posixpath')"), + ] + import sys + # Replace __builtin__.__import__ to trace the calls + import __builtin__ + oldimp = __builtin__.__import__ + try: + def __import__(name, globs, locs, fromlist, level=-1): + mod = oldimp(name, globs, locs, fromlist, level) + globs["result"] = str((name, fromlist, level, mod.__name__)) + raise ImportError + + __builtin__.__import__ = __import__ + failed = 0 + for statement, expected in tests: + try: + c = compile(statement, "<unknown>", "exec") + exec c in locals(), globals() + raise Exception("ImportError expected.") + except ImportError: + pass + self.assertEquals(expected, result) + finally: + __builtin__.__import__ = oldimp + def test_main(): - test_support.run_unittest(MislabeledImportTestCase) + test_classes = [MislabeledImportTestCase, OverrideBuiltinsImportTestCase] + test_support.run_unittest(*test_classes) if __name__ == '__main__': test_main() Modified: trunk/jython/src/org/python/core/__builtin__.java =================================================================== --- trunk/jython/src/org/python/core/__builtin__.java 2008-11-14 17:53:21 UTC (rev 5580) +++ trunk/jython/src/org/python/core/__builtin__.java 2008-11-14 22:54:53 UTC (rev 5581) @@ -1266,7 +1266,8 @@ PyObject globals = ap.getPyObject(1, null); PyObject fromlist = ap.getPyObject(3, Py.EmptyTuple); int level = ap.getInt(4, imp.DEFAULT_LEVEL); - return imp.importName(module.intern(), fromlist.__len__() == 0, globals, fromlist, level); + return imp.importName(module.intern(), fromlist == Py.None || fromlist.__len__() == 0, + globals, fromlist, level); } } Modified: trunk/jython/src/org/python/core/imp.java =================================================================== --- trunk/jython/src/org/python/core/imp.java 2008-11-14 17:53:21 UTC (rev 5580) +++ trunk/jython/src/org/python/core/imp.java 2008-11-14 22:54:53 UTC (rev 5581) @@ -754,7 +754,7 @@ */ public static PyObject importOne(String mod, PyFrame frame) { PyObject module = __builtin__.__import__(mod, frame.f_globals, frame - .getLocals(), Py.EmptyTuple); + .getLocals(), Py.None); return module; } @@ -764,7 +764,19 @@ */ public static PyObject importOneAs(String mod, PyFrame frame) { PyObject module = __builtin__.__import__(mod, frame.f_globals, frame - .getLocals(), getStarArg()); + .getLocals(), Py.None); + int dot = mod.indexOf('.'); + while (dot != -1) { + int dot2 = mod.indexOf('.', dot + 1); + String name; + if (dot2 == -1) { + name = mod.substring(dot + 1); + } else { + name = mod.substring(dot + 1, dot2); + } + module = module.__getattr__(name); + dot = dot2; + } return module; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |