summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-06-10 17:44:05 -0400
committerRich Hickey <richhickey@gmail.com>2010-06-10 17:44:05 -0400
commit9ad685bac487eae0e37341b2ff9f642a575d1a0d (patch)
tree915c5647c4c3803ca71ece42d74d20c477d9683c
parentd4239d0bde19d8010042f1a04bb20d4ea0cf8329 (diff)
flow type hints on static invoke calls
-rw-r--r--src/jvm/clojure/lang/Compiler.java12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index abcccd01..4485fe5f 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -2843,15 +2843,17 @@ static class StaticInvokeExpr implements Expr, MaybePrimitiveExpr{
public final Type[] paramtypes;
public final IPersistentVector args;
public final boolean variadic;
+ public final Symbol tag;
StaticInvokeExpr(Type target, Class retClass, Class[] paramclasses, Type[] paramtypes, boolean variadic,
- IPersistentVector args){
+ IPersistentVector args,Symbol tag){
this.target = target;
this.retClass = retClass;
this.paramclasses = paramclasses;
this.paramtypes = paramtypes;
this.args = args;
this.variadic = variadic;
+ this.tag = tag;
}
public Object eval() throws Exception{
@@ -2876,7 +2878,7 @@ static class StaticInvokeExpr implements Expr, MaybePrimitiveExpr{
}
public Class getJavaClass() throws Exception{
- return retClass;
+ return tag != null ? HostExpr.tagToClass(tag) : retClass;
}
public boolean canEmitPrimitive(){
@@ -2921,7 +2923,7 @@ static class StaticInvokeExpr implements Expr, MaybePrimitiveExpr{
return Type.getType(retClass);
}
- public static Expr parse(Var v, ISeq args) throws Exception{
+ public static Expr parse(Var v, ISeq args, Symbol tag) throws Exception{
IPersistentCollection paramlists = (IPersistentCollection) RT.get(v.meta(), arglistsKey);
if(paramlists == null)
throw new IllegalStateException("Can't call static fn with no arglists: " + v);
@@ -2987,7 +2989,7 @@ static class StaticInvokeExpr implements Expr, MaybePrimitiveExpr{
argv = argv.cons(analyze(C.EXPRESSION, s.first()));
return new StaticInvokeExpr(target,retClass,paramClasses.toArray(new Class[paramClasses.size()]),
- paramTypes.toArray(new Type[paramTypes.size()]),variadic, argv);
+ paramTypes.toArray(new Type[paramTypes.size()]),variadic, argv, tag);
}
}
@@ -3208,7 +3210,7 @@ static class InvokeExpr implements Expr{
Var v = ((VarExpr)fexpr).var;
if(RT.booleanCast(RT.get(RT.meta(v),staticKey)))
{
- return StaticInvokeExpr.parse(v, RT.next(form));
+ return StaticInvokeExpr.parse(v, RT.next(form), tagOf(form));
}
}