diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 17 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Reflector.java | 2 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index f046e116..83fd19e9 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -31,6 +31,7 @@ import java.io.*; import java.math.BigInteger; import java.util.List; import java.util.ArrayList; +import java.util.LinkedList; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; @@ -898,7 +899,11 @@ static class InstanceMethodExpr extends MethodExpr{ for(int i = 0; i < args.count(); i++) argvals[i] = ((Expr) args.nth(i)).eval(); if(method != null) - return method.invoke(targetval, argvals); + { + LinkedList ms = new LinkedList(); + ms.add(method); + return Reflector.invokeMatchingMethod(methodName, ms, targetval, argvals); + } return Reflector.invokeInstanceMethod(targetval, methodName, argvals); } @@ -975,7 +980,11 @@ static class StaticMethodExpr extends MethodExpr{ for(int i = 0; i < args.count(); i++) argvals[i] = ((Expr) args.nth(i)).eval(); if(method != null) - return method.invoke(null, argvals); + { + LinkedList ms = new LinkedList(); + ms.add(method); + return Reflector.invokeMatchingMethod(methodName, ms, null, argvals); + } return Reflector.invokeStaticMethod(className, methodName, argvals); } @@ -1618,7 +1627,9 @@ static class NewExpr implements Expr{ for(int i = 0; i < args.count(); i++) argvals[i] = ((Expr) args.nth(i)).eval(); if(this.ctor != null) - return ctor.newInstance(argvals); + { + return ctor.newInstance(Reflector.boxArgs(ctor.getParameterTypes(), argvals)); + } return Reflector.invokeConstructor(Class.forName(className), argvals); } diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java index dea19a09..a99dcaa2 100644 --- a/src/jvm/clojure/lang/Reflector.java +++ b/src/jvm/clojure/lang/Reflector.java @@ -26,7 +26,7 @@ public static Object invokeInstanceMethod(Object target, String methodName, Obje return prepRet(invokeMatchingMethod(methodName, methods, target, args)); } -private static Object invokeMatchingMethod(String methodName, List methods, Object target, Object[] args) +static Object invokeMatchingMethod(String methodName, List methods, Object target, Object[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{ Method m = null; Object[] boxedArgs = null; |