diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-02-10 17:07:19 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-02-10 17:07:19 +0000 |
commit | 3e4c6f003de2a50d164a90defb566dba93f465a1 (patch) | |
tree | e32b447fe7b5de05b6d9b560f9e4e1e1881672f2 | |
parent | dd6c6176eac1fa58a330fb768a0d57a422da3efd (diff) |
added exact-match-wins in getMatchingParams
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 11 |
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) |