diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 32 | ||||
-rw-r--r-- | src/jvm/clojure/lang/DynamicClassLoader.java | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 30 |
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)); } |