summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java32
-rw-r--r--src/jvm/clojure/lang/DynamicClassLoader.java7
-rw-r--r--src/jvm/clojure/lang/RT.java30
3 files changed, 37 insertions, 32 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 364e792f..a5aba11e 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -1101,9 +1101,14 @@ static class InstanceMethodExpr extends MethodExpr{
if(methods.size() > 1)
{
ArrayList<Class[]> params = new ArrayList();
+ ArrayList<Class> rets = new ArrayList();
for(int i = 0; i < methods.size(); i++)
- params.add(((java.lang.reflect.Method) methods.get(i)).getParameterTypes());
- methodidx = getMatchingParams(methodName, params, args);
+ {
+ java.lang.reflect.Method m = (java.lang.reflect.Method)methods.get(i);
+ params.add(m.getParameterTypes());
+ rets.add(m.getReturnType());
+ }
+ methodidx = getMatchingParams(methodName, params, args,rets);
}
java.lang.reflect.Method m =
(java.lang.reflect.Method) (methodidx >= 0 ? methods.get(methodidx) : null);
@@ -1249,9 +1254,14 @@ static class StaticMethodExpr extends MethodExpr{
if(methods.size() > 1)
{
ArrayList<Class[]> params = new ArrayList();
+ ArrayList<Class> rets = new ArrayList();
for(int i = 0; i < methods.size(); i++)
- params.add(((java.lang.reflect.Method) methods.get(i)).getParameterTypes());
- methodidx = getMatchingParams(methodName, params, args);
+ {
+ java.lang.reflect.Method m = (java.lang.reflect.Method) methods.get(i);
+ params.add(m.getParameterTypes());
+ rets.add(m.getReturnType());
+ }
+ methodidx = getMatchingParams(methodName, params, args,rets);
}
method = (java.lang.reflect.Method) (methodidx >= 0 ? methods.get(methodidx) : null);
if(method == null && RT.booleanCast(RT.WARN_ON_REFLECTION.get()))
@@ -2007,7 +2017,7 @@ static boolean subsumes(Class[] c1, Class[] c2){
return better;
}
-static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, IPersistentVector argexprs)
+static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, IPersistentVector argexprs, List<Class> rets)
throws Exception{
//presumes matching lengths
int matchIdx = -1;
@@ -2033,8 +2043,12 @@ static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, I
matchIdx = i;
tied = false;
}
- else if(!(subsumes(paramlists.get(matchIdx), paramlists.get(i))
- || Arrays.equals(paramlists.get(matchIdx), paramlists.get(i))))
+ else if(Arrays.equals(paramlists.get(matchIdx), paramlists.get(i)))
+ {
+ if(rets.get(matchIdx).isAssignableFrom(rets.get(i)))
+ matchIdx = i;
+ }
+ else if(!(subsumes(paramlists.get(matchIdx), paramlists.get(i))))
tied = true;
}
}
@@ -2060,6 +2074,7 @@ public static class NewExpr implements Expr{
Constructor[] allctors = c.getConstructors();
ArrayList ctors = new ArrayList();
ArrayList<Class[]> params = new ArrayList();
+ ArrayList<Class> rets = new ArrayList();
for(int i = 0; i < allctors.length; i++)
{
Constructor ctor = allctors[i];
@@ -2067,6 +2082,7 @@ public static class NewExpr implements Expr{
{
ctors.add(ctor);
params.add(ctor.getParameterTypes());
+ rets.add(c);
}
}
if(ctors.isEmpty())
@@ -2075,7 +2091,7 @@ public static class NewExpr implements Expr{
int ctoridx = 0;
if(ctors.size() > 1)
{
- ctoridx = getMatchingParams(c.getName(), params, args);
+ ctoridx = getMatchingParams(c.getName(), params, args, rets);
}
this.ctor = ctoridx >= 0 ? (Constructor) ctors.get(ctoridx) : null;
diff --git a/src/jvm/clojure/lang/DynamicClassLoader.java b/src/jvm/clojure/lang/DynamicClassLoader.java
index 3d548a81..6f956916 100644
--- a/src/jvm/clojure/lang/DynamicClassLoader.java
+++ b/src/jvm/clojure/lang/DynamicClassLoader.java
@@ -27,8 +27,11 @@ HashMap<String, byte[]> map = new HashMap<String, byte[]>();
static final URL[] EMPTY_URLS = new URL[]{};
public DynamicClassLoader(){
- super(EMPTY_URLS,Thread.currentThread().getContextClassLoader());
- //super(Compiler.class.getClassLoader());
+ //pseudo test in lieu of hasContextClassLoader()
+ super(EMPTY_URLS,(Thread.currentThread().getContextClassLoader() == null ||
+ Thread.currentThread().getContextClassLoader() == ClassLoader.getSystemClassLoader())?
+ Compiler.class.getClassLoader():Thread.currentThread().getContextClassLoader());
+// super(EMPTY_URLS,Compiler.class.getClassLoader());
}
public DynamicClassLoader(ClassLoader parent){
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index fe7e95e7..2ad2ae49 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -381,47 +381,33 @@ static public void load(String scriptbase, boolean failIfNotFound) throws Except
String cljfile = scriptbase + ".clj";
URL classURL = baseLoader().getResource(classfile);
URL cljURL = baseLoader().getResource(cljfile);
- boolean failed = false;
+ boolean loaded = false;
- if(classURL != null &&
- (cljURL == null
- || lastModified(classURL, classfile) > lastModified(cljURL, cljfile)))
+ if((classURL != null &&
+ (cljURL == null
+ || lastModified(classURL, classfile) > lastModified(cljURL, cljfile)))
+ || classURL == null)
{
try
{
Var.pushThreadBindings(
RT.map(CURRENT_NS, CURRENT_NS.get(),
WARN_ON_REFLECTION, WARN_ON_REFLECTION.get()));
- loadClassForName(scriptbase.replace('/','.') + LOADER_SUFFIX);
+ loaded = (loadClassForName(scriptbase.replace('/','.') + LOADER_SUFFIX) != null);
}
finally
{
Var.popThreadBindings();
}
}
- else if(cljURL != null)
+ if(!loaded && cljURL != null)
{
if (booleanCast(Compiler.COMPILE_FILES.get()))
compile(cljfile);
else
loadResourceScript(RT.class, cljfile);
}
- else
- {
- try
- {
- Var.pushThreadBindings(
- RT.map(CURRENT_NS, CURRENT_NS.get(),
- WARN_ON_REFLECTION, WARN_ON_REFLECTION.get()));
- failed = loadClassForName(scriptbase.replace('/','.') + LOADER_SUFFIX) == null;
- }
- finally
- {
- Var.popThreadBindings();
- }
- }
-
- if(failed && failIfNotFound)
+ else if(!loaded && failIfNotFound)
throw new FileNotFoundException(String.format("Could not locate %s or %s on classpath: ", classfile, cljfile));
}