summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-03-24 14:34:32 +0000
committerRich Hickey <richhickey@gmail.com>2008-03-24 14:34:32 +0000
commit135c7b3bf87ea2e9e201b52ae8ff48b44f2bd511 (patch)
treea33bde9ecf397c0da369d4a2471006da58b304c1 /src
parente5f0446e668b7593a41fbe7bc9d7bbc268a8a98b (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.java11
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);