summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java17
-rw-r--r--src/jvm/clojure/lang/Reflector.java2
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;