From: <fwi...@us...> - 2009-08-04 23:50:50
|
Revision: 6630 http://jython.svn.sourceforge.net/jython/?rev=6630&view=rev Author: fwierzbicki Date: 2009-08-04 23:50:44 +0000 (Tue, 04 Aug 2009) Log Message: ----------- Another step towards fixing #1415. Now handling arg parsing of AST nodes more like CPython (well, once the AST codegen is done). Modified Paths: -------------- trunk/jython/ast/asdl_antlr.py trunk/jython/src/org/python/antlr/AST.java trunk/jython/src/org/python/core/ArgParser.java Modified: trunk/jython/ast/asdl_antlr.py =================================================================== --- trunk/jython/ast/asdl_antlr.py 2009-08-04 19:54:15 UTC (rev 6629) +++ trunk/jython/ast/asdl_antlr.py 2009-08-04 23:50:44 UTC (rev 6630) @@ -481,7 +481,7 @@ self.emit("@ExposedMethod", depth) self.emit("public void %s___init__(PyObject[] args, String[] keywords) {" % clsname, depth) self.emit('ArgParser ap = new ArgParser("%s", args, keywords, new String[]' % clsname, depth + 1) - self.emit('{%s}, 0);' % fpargs, depth + 2) + self.emit('{%s}, %s, true);' % (fpargs, len(fields)), depth + 2) i = 0 for f in fields: self.emit("set%s(ap.getPyObject(%s, Py.None));" % (self.processFieldName(f.name), Modified: trunk/jython/src/org/python/antlr/AST.java =================================================================== --- trunk/jython/src/org/python/antlr/AST.java 2009-08-04 19:54:15 UTC (rev 6629) +++ trunk/jython/src/org/python/antlr/AST.java 2009-08-04 23:50:44 UTC (rev 6630) @@ -1,5 +1,7 @@ package org.python.antlr; +import org.python.core.Py; +import org.python.core.PyException; import org.python.core.PyObject; import org.python.core.PyType; import org.python.expose.ExposedType; @@ -15,4 +17,21 @@ super(objtype); } + public static boolean check(int nargs, int expected, boolean takesZeroArgs) { + if (nargs == expected) { + return true; + } + if (takesZeroArgs && nargs == 0) { + return true; + } + return false; + } + + public static PyException unexpectedCall(int expected, String name) { + String message = " constructor takes 0 positional arguments"; + if (expected != 0) { + message = " constructor takes either 0 or " + expected + " arguments"; + } + return Py.TypeError(name + message); + } } Modified: trunk/jython/src/org/python/core/ArgParser.java =================================================================== --- trunk/jython/src/org/python/core/ArgParser.java 2009-08-04 19:54:15 UTC (rev 6629) +++ trunk/jython/src/org/python/core/ArgParser.java 2009-08-04 23:50:44 UTC (rev 6630) @@ -3,6 +3,8 @@ import java.util.HashSet; import java.util.Set; +import org.python.antlr.AST; + /** * A utility class for handling mixed positional and keyword arguments. * @@ -122,6 +124,16 @@ } } + public ArgParser(String funcname, PyObject[] args, String[] kws, + String[] paramnames, int minargs, boolean takesZeroArgs) { + this(funcname, args, kws); + this.params = paramnames; + check(); + if (!AST.check(args.length - kws.length, minargs, takesZeroArgs)) { + throw AST.unexpectedCall(minargs, funcname); + } + } + /** * Return a required argument as a String. * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |