summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java20
-rw-r--r--src/jvm/clojure/lang/Reflector.java2
2 files changed, 18 insertions, 4 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index d9567c31..1fa4e2e7 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -32,6 +32,7 @@ import java.math.BigInteger;
import java.util.List;
import java.util.ArrayList;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
public class Compiler implements Opcodes{
@@ -877,7 +878,14 @@ static class InstanceMethodExpr extends MethodExpr{
params.add(((java.lang.reflect.Method) methods.get(i)).getParameterTypes());
methodidx = getMatchingParams(params, args);
}
- method = (java.lang.reflect.Method) (methodidx >= 0 ? methods.get(methodidx) : null);
+ java.lang.reflect.Method m =
+ (java.lang.reflect.Method) (methodidx >= 0 ? methods.get(methodidx) : null);
+ if(m != null && !Modifier.isPublic(m.getDeclaringClass().getModifiers()))
+ {
+ //public method of non-public class, try to find it in hierarchy
+ m = Reflector.getAsMethodOfPublicBase(m.getDeclaringClass(), m);
+ }
+ method = m;
}
}
else
@@ -889,6 +897,8 @@ static class InstanceMethodExpr extends MethodExpr{
Object[] argvals = new Object[args.count()];
for(int i = 0; i < args.count(); i++)
argvals[i] = ((Expr) args.nth(i)).eval();
+ if(method != null)
+ return method.invoke(targetval, argvals);
return Reflector.invokeInstanceMethod(targetval, methodName, argvals);
}
@@ -964,6 +974,8 @@ static class StaticMethodExpr extends MethodExpr{
Object[] argvals = new Object[args.count()];
for(int i = 0; i < args.count(); i++)
argvals[i] = ((Expr) args.nth(i)).eval();
+ if(method != null)
+ return method.invoke(null, argvals);
return Reflector.invokeStaticMethod(className, methodName, argvals);
}
@@ -1554,7 +1566,7 @@ static int getMatchingParams(ArrayList<Class[]> paramlists, IPersistentVector ar
for(int p = 0; match && p < argexprs.count() && aseq != null; ++p, aseq = aseq.rest())
{
Expr arg = (Expr) aseq.first();
- Class aclass = arg.hasJavaClass()? arg.getJavaClass():Object.class;
+ Class aclass = arg.hasJavaClass() ? arg.getJavaClass() : Object.class;
match = Reflector.paramArgTypeMatch(paramlists.get(i)[p], aclass);
}
if(match)
@@ -1605,6 +1617,8 @@ static class NewExpr implements Expr{
Object[] argvals = new Object[args.count()];
for(int i = 0; i < args.count(); i++)
argvals[i] = ((Expr) args.nth(i)).eval();
+ if(this.ctor != null)
+ return ctor.newInstance(argvals);
return Reflector.invokeConstructor(Class.forName(className), argvals);
}
@@ -2463,7 +2477,7 @@ static class FnMethod{
else
{
- LocalBinding lb = registerLocal(p, state==PSTATE.REST?ISEQ:tagOf(p), null);
+ LocalBinding lb = registerLocal(p, state == PSTATE.REST ? ISEQ : tagOf(p), null);
argLocals = argLocals.cons(lb);
switch(state)
{
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java
index 32560cdb..dea19a09 100644
--- a/src/jvm/clojure/lang/Reflector.java
+++ b/src/jvm/clojure/lang/Reflector.java
@@ -346,7 +346,7 @@ static boolean isCongruent(Class[] params, Object[] args){
static Object prepRet(Object x){
if(x instanceof Boolean)
- return ((Boolean) x).booleanValue() ? RT.T : null;
+ return ((Boolean) x).booleanValue() ? x : null;
return x;
}
}