diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-03-24 14:34:32 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-03-24 14:34:32 +0000 |
commit | 135c7b3bf87ea2e9e201b52ae8ff48b44f2bd511 (patch) | |
tree | a33bde9ecf397c0da369d4a2471006da58b304c1 /src | |
parent | e5f0446e668b7593a41fbe7bc9d7bbc268a8a98b (diff) |
use subsuming method, if any, rather than first found, when overloaded w/same arity
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Reflector.java | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java index 4a1cf7c1..e213d743 100644 --- a/src/jvm/clojure/lang/Reflector.java +++ b/src/jvm/clojure/lang/Reflector.java @@ -41,6 +41,7 @@ static Object invokeMatchingMethod(String methodName, List methods, Object targe } else //overloaded w/same arity { + Method foundm = null; for(Iterator i = methods.iterator(); i.hasNext();) { m = (Method) i.next(); @@ -48,12 +49,14 @@ static Object invokeMatchingMethod(String methodName, List methods, Object targe Class[] params = m.getParameterTypes(); if(isCongruent(params, args)) { - boxedArgs = boxArgs(params, args); - break; + if(foundm == null || Compiler.subsumes(params,foundm.getParameterTypes())) + { + foundm = m; + boxedArgs = boxArgs(params, args); + } } - else - m = null; } + m = foundm; } if(m == null) throw new IllegalArgumentException("No matching method found: " + methodName); |