summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-12-20 20:04:45 +0000
committerRich Hickey <richhickey@gmail.com>2007-12-20 20:04:45 +0000
commit3d5084fe755c815a09211e2678a89df8e50ea114 (patch)
treee1ca8441814d510cfb9e980db8226c3eb30c2cde /src
parentbce22e39c40c65cd0b4d97c813beba0d98f2339d (diff)
Var type hints
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj20
-rw-r--r--src/jvm/clojure/lang/Compiler.java33
-rw-r--r--src/jvm/clojure/lang/Var.java9
3 files changed, 43 insertions, 19 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 4064281d..7be165e7 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -77,10 +77,10 @@
(defn eql? [x y] (. clojure.lang.RT (equal x y)))
-(defn str [#^Object x]
+(defn #^String str [#^Object x]
(if x (. x (toString)) ""))
-(defn strcat [x & ys]
+(defn #^String strcat [x & ys]
(let [#^String s (str x)]
(if ys
(recur (. s (concat (str (first ys)))) (rest ys))
@@ -783,28 +783,28 @@
ret#))
-(defn int [x]
+(defn #^Integer int [x]
(. clojure.lang.RT (intCast x)))
-(defn long [#^Number x]
+(defn #^Long long [#^Number x]
(. x (longValue)))
-(defn float [#^Number x]
+(defn #^Float float [#^Number x]
(. x (floatValue)))
-(defn double [#^Number x]
+(defn #^Double double [#^Number x]
(. x (doubleValue)))
-(defn short [#^Number x]
+(defn #^Short short [#^Number x]
(. x (shortValue)))
-(defn byte [#^Number x]
+(defn #^Byte byte [#^Number x]
(. x (byteValue)))
-(defn char [x]
+(defn #^Character char [x]
(. clojure.lang.RT (charCast x)))
-(defn boolean [x]
+(defn #^Boolean boolean [x]
(if x
(. Boolean TRUE)
(. Boolean FALSE)))
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index ecd667ff..071fe670 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -12,13 +12,13 @@
package clojure.lang;
-//*
+/*
import clojure.asm.*;
import clojure.asm.commons.Method;
import clojure.asm.commons.GeneratorAdapter;
/*/
-/*
+//*
import org.objectweb.asm.*;
import org.objectweb.asm.commons.Method;
@@ -227,18 +227,23 @@ static Symbol resolveSymbol(Symbol sym){
static class DefExpr implements Expr{
final Var var;
final Expr init;
+ final Symbol tag;
final boolean initProvided;
final static Method bindRootMethod = Method.getMethod("void bindRoot(Object)");
+ final static Method setTagMethod = Method.getMethod("void setTag(clojure.lang.Symbol)");
+ final static Method symcreate = Method.getMethod("clojure.lang.Symbol create(String, String)");
- public DefExpr(Var var, Expr init, boolean initProvided){
+ public DefExpr(Var var, Expr init, boolean initProvided, Symbol tag){
this.var = var;
this.init = init;
this.initProvided = initProvided;
+ this.tag = tag;
}
public Object eval() throws Exception{
if(initProvided)
var.bindRoot(init.eval());
+ var.setTag(tag);
return var;
}
@@ -250,6 +255,16 @@ static class DefExpr implements Expr{
init.emit(C.EXPRESSION, fn, gen);
gen.invokeVirtual(VAR_TYPE, bindRootMethod);
}
+ gen.dup();
+ if(tag != null)
+ {
+ gen.push(tag.ns);
+ gen.push(tag.name);
+ gen.invokeStatic(SYMBOL_TYPE, symcreate);
+ }
+ else
+ gen.visitInsn(Opcodes.ACONST_NULL);
+ gen.invokeVirtual(VAR_TYPE, setTagMethod);
if(context == C.STATEMENT)
gen.pop();
}
@@ -284,7 +299,7 @@ static class DefExpr implements Expr{
throw new Exception("Can't create defs outside of current ns");
}
return new DefExpr(v, analyze(context == C.EVAL ? context : C.EXPRESSION, RT.third(form), v.sym.name),
- RT.count(form) == 3);
+ RT.count(form) == 3, tagOf(sym));
}
}
}
@@ -336,7 +351,7 @@ static class VarExpr implements Expr, AssignableExpr{
public VarExpr(Var var, Symbol tag){
this.var = var;
- this.tag = tag;
+ this.tag = tag!=null?tag:var.getTag();
}
public Object eval() throws Exception{
@@ -356,7 +371,7 @@ static class VarExpr implements Expr, AssignableExpr{
}
public Class getJavaClass() throws ClassNotFoundException{
- return HostExpr.tagToClass(tag);
+ return HostExpr.tagToClass(tag);
}
public Object evalAssign(Expr val) throws Exception{
@@ -1978,7 +1993,7 @@ static class InvokeExpr implements Expr{
this.fexpr = fexpr;
this.args = args;
this.line = line;
- this.tag = tag;
+ this.tag = tag!=null?tag:(fexpr instanceof VarExpr?((VarExpr)fexpr).tag:null);
}
public Object eval() throws Exception{
@@ -2152,8 +2167,8 @@ static class FnExpr implements Expr{
//derived from AFn/RestFn
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// ClassWriter cw = new ClassWriter(0);
- ClassVisitor cv = cw;
- //ClassVisitor cv = new TraceClassVisitor(new CheckClassAdapter(cw), new PrintWriter(System.out));
+ //ClassVisitor cv = cw;
+ ClassVisitor cv = new TraceClassVisitor(new CheckClassAdapter(cw), new PrintWriter(System.out));
//ClassVisitor cv = new TraceClassVisitor(cw, new PrintWriter(System.out));
cv.visit(V1_5, ACC_PUBLIC, internalName, null, isVariadic() ? "clojure/lang/RestFn" : "clojure/lang/AFn", null);
String source = (String) SOURCE.get();
diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java
index 0e0c5615..3c1dd3f4 100644
--- a/src/jvm/clojure/lang/Var.java
+++ b/src/jvm/clojure/lang/Var.java
@@ -48,6 +48,7 @@ volatile Object root;
transient final AtomicInteger count;
final public Symbol sym;
boolean macroFlag = false;
+Symbol tag;
static ConcurrentHashMap<Symbol, Var> table = new ConcurrentHashMap<Symbol, Var>();
@@ -158,6 +159,14 @@ public Object getRoot(){
return root;
}
+public Symbol getTag(){
+ return tag;
+}
+
+public void setTag(Symbol tag){
+ this.tag = tag;
+}
+
final public boolean hasRoot(){
return root != dvals;
}