summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-02-10 17:07:19 +0000
committerRich Hickey <richhickey@gmail.com>2009-02-10 17:07:19 +0000
commit3e4c6f003de2a50d164a90defb566dba93f465a1 (patch)
treee32b447fe7b5de05b6d9b560f9e4e1e1881672f2
parentdd6c6176eac1fa58a330fb768a0d57a422da3efd (diff)
added exact-match-wins in getMatchingParams
-rw-r--r--src/jvm/clojure/lang/Compiler.java11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 4ba30b5e..3f0c4e48 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -1998,7 +1998,7 @@ static class ClassExpr implements Expr{
}
*/
-static boolean subsumes(Class[] c1, Class[] c2){
+static public boolean subsumes(Class[] c1, Class[] c2){
//presumes matching lengths
Boolean better = false;
for(int i = 0; i < c1.length; i++)
@@ -2026,12 +2026,19 @@ static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, I
{
boolean match = true;
ISeq aseq = argexprs.seq();
+ int exact = 0;
for(int p = 0; match && p < argexprs.count() && aseq != null; ++p, aseq = aseq.rest())
{
Expr arg = (Expr) aseq.first();
Class aclass = arg.hasJavaClass() ? arg.getJavaClass() : Object.class;
- match = Reflector.paramArgTypeMatch(paramlists.get(i)[p], aclass);
+ Class pclass = paramlists.get(i)[p];
+ if(arg.hasJavaClass() && aclass == pclass)
+ exact++;
+ else
+ match = Reflector.paramArgTypeMatch(pclass, aclass);
}
+ if(exact == argexprs.count())
+ return i;
if(match)
{
if(matchIdx == -1)