summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-08-13 15:06:51 +0000
committerRich Hickey <richhickey@gmail.com>2008-08-13 15:06:51 +0000
commit00acf5e69e4ccb4fb1a2717d0894d9ca01c7e91f (patch)
treea87cc2f25c75636094cf2a3b442791535fe26454
parent3f0c711fe4f7e05b4232d85f9f9d0f81e28d9c90 (diff)
allow bridge methods if reprobing on same sig yields same method
-rw-r--r--src/jvm/clojure/lang/Reflector.java26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java
index d5b14edc..13c9125d 100644
--- a/src/jvm/clojure/lang/Reflector.java
+++ b/src/jvm/clojure/lang/Reflector.java
@@ -77,9 +77,10 @@ static Object invokeMatchingMethod(String methodName, List methods, Object targe
}
if(m == null)
throw new IllegalArgumentException("No matching method found: " + methodName);
- try{
- return prepRet(m.getReturnType(), m.invoke(target, boxedArgs));
- }
+ try
+ {
+ return prepRet(m.getReturnType(), m.invoke(target, boxedArgs));
+ }
catch(InvocationTargetException e)
{
if(e.getCause() instanceof Exception)
@@ -290,12 +291,21 @@ static public List getMethods(Class c, int arity, String name, boolean getStatic
ArrayList methods = new ArrayList();
for(int i = 0; i < allmethods.length; i++)
{
- if(name.equals(allmethods[i].getName())
- && Modifier.isStatic(allmethods[i].getModifiers()) == getStatics
- && !Modifier.isVolatile(allmethods[i].getModifiers())
- && allmethods[i].getParameterTypes().length == arity)
+ try
+ {
+ if(name.equals(allmethods[i].getName())
+ && Modifier.isStatic(allmethods[i].getModifiers()) == getStatics
+ && allmethods[i].getParameterTypes().length == arity
+ && (!Modifier.isVolatile(allmethods[i].getModifiers())
+ || c.getMethod(allmethods[i].getName(), allmethods[i].getParameterTypes())
+ .equals(allmethods[i])))
+ {
+ methods.add(allmethods[i]);
+ }
+ }
+ catch(NoSuchMethodException e)
{
- methods.add(allmethods[i]);
+ throw new RuntimeException(e);
}
}
if(!getStatics && c.isInterface())