From: <fwi...@us...> - 2009-03-03 15:54:10
|
Revision: 6064 http://jython.svn.sourceforge.net/jython/?rev=6064&view=rev Author: fwierzbicki Date: 2009-03-03 15:54:04 +0000 (Tue, 03 Mar 2009) Log Message: ----------- Test and fix for http://bugs.jython.org/issue1222877. Duplicate keyword args where erroneously permitted in Jython. Thanks to Khalid Zuberi for taking a crack at a patch, I modified the patch to avoid an extra loop. Modified Paths: -------------- trunk/jython/Lib/test/test_func_syntax_jy.py trunk/jython/src/org/python/core/ArgParser.java Modified: trunk/jython/Lib/test/test_func_syntax_jy.py =================================================================== --- trunk/jython/Lib/test/test_func_syntax_jy.py 2009-03-03 07:09:37 UTC (rev 6063) +++ trunk/jython/Lib/test/test_func_syntax_jy.py 2009-03-03 15:54:04 UTC (rev 6064) @@ -9,6 +9,10 @@ self.assertRaises(SyntaxError, eval, "parrot(voltage=.5, \'dead\')") + def test_dup_keywords(self): + self.assertRaises(TypeError, eval, + "complex(imag=4, imag=2)") + def test_main(): test.test_support.run_unittest(FuncSyntaxTest) Modified: trunk/jython/src/org/python/core/ArgParser.java =================================================================== --- trunk/jython/src/org/python/core/ArgParser.java 2009-03-03 07:09:37 UTC (rev 6063) +++ trunk/jython/src/org/python/core/ArgParser.java 2009-03-03 15:54:04 UTC (rev 6064) @@ -1,5 +1,8 @@ package org.python.core; +import java.util.HashSet; +import java.util.Set; + /** * A utility class for handling mixed positional and keyword arguments. * @@ -239,19 +242,26 @@ } private void check() { - int nargs = this.args.length - this.kws.length; - l1: for (int i = 0; i < this.kws.length; i++) { - for (int j = 0; j < this.params.length; j++) { - if (this.kws[i].equals(this.params[j])) { + Set<Integer> usedKws = new HashSet<Integer>(); + int nargs = args.length - kws.length; + l1: for (int i = 0; i < kws.length; i++) { + for (int j = 0; j < params.length; j++) { + if (kws[i].equals(params[j])) { if (j < nargs) { throw Py.TypeError("keyword parameter '" - + this.params[j] + + params[j] + "' was given by position and by name"); } + if (usedKws.contains(j)) { + throw Py.TypeError(String.format( + "%s got multiple values for keyword argument '%s'", + funcname, params[j])); + } + usedKws.add(j); continue l1; } } - throw Py.TypeError("'" + this.kws[i] + "' is an invalid keyword " + throw Py.TypeError("'" + kws[i] + "' is an invalid keyword " + "argument for this function"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |