diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-12-20 20:04:45 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-12-20 20:04:45 +0000 |
commit | 3d5084fe755c815a09211e2678a89df8e50ea114 (patch) | |
tree | e1ca8441814d510cfb9e980db8226c3eb30c2cde /src | |
parent | bce22e39c40c65cd0b4d97c813beba0d98f2339d (diff) |
Var type hints
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 20 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 33 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 9 |
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; } |