diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-16 17:09:52 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-16 17:09:52 +0000 |
commit | 414f12b134344baee0f5d183551d24b577ec66a5 (patch) | |
tree | a9369b9ed33a189af48acf61cfd6b117a115a43c | |
parent | d041b1fe404e73fb01ee572825d32a1d9df731d7 (diff) |
interim checkin
-rw-r--r-- | src/boot.clj | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 32 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 11 |
3 files changed, 43 insertions, 12 deletions
diff --git a/src/boot.clj b/src/boot.clj index a6af2b3d..cf5d2321 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -17,10 +17,10 @@ ([& args] (. clojure.lang.PersistentHashMap (create args)))) -(defn meta [x] +(defn meta [#^IObj x] (. x (meta))) -(defn with-meta [x m] +(defn with-meta [#^IObj x m] (. x (withMeta m))) (def defmacro (fn [name & args] @@ -50,13 +50,13 @@ (defn eql? [x y] (. RT (equal x y))) -(defn strcat [x y] (. x (concat y))) +(defn strcat [#^String x y] (. x (concat y))) -(defn str [x] (. x (toString))) +(defn str [#^Object x] (. x (toString))) (defn gensym ([] (thisfn "G__")) - ([prefix-string] (. clojure.lang.Symbol (intern (strcat prefix-string (str (. RT (nextID)))))))) + ([prefix-string] (. Symbol (intern (strcat prefix-string (str (. RT (nextID)))))))) (defmacro cond [& clauses] (when clauses @@ -70,7 +70,7 @@ (nil? (rest arglist)) (first arglist) :else (cons (first arglist) (thisfn (rest arglist))))) -(defn apply [f & args] +(defn apply [#^IFn f & args] (. f (applyTo (spread args)))) (defn list* [& args] diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 180c150f..e6d58211 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -449,6 +449,10 @@ static abstract class HostExpr implements Expr{ NIL_EXPR.emit(C.EXPRESSION, fn, gen); gen.mark(endLabel); } + else if(returnType == void.class) + { + NIL_EXPR.emit(C.EXPRESSION, fn, gen); + } else if(returnType == char.class) { gen.invokeStatic(CHAR_TYPE, valueOfMethod); @@ -751,10 +755,26 @@ static class InstanceMethodExpr extends MethodExpr{ public void emit(C context, FnExpr fn, GeneratorAdapter gen){ gen.visitLineNumber(line, gen.mark()); - target.emit(C.EXPRESSION, fn, gen); - gen.push(methodName); - emitArgsAsArray(args, fn, gen); - gen.invokeStatic(REFLECTOR_TYPE, invokeInstanceMethodMethod); + if(method != null) + { + Type type = Type.getType(method.getDeclaringClass()); + target.emit(C.EXPRESSION, fn, gen); + gen.checkCast(type); + MethodExpr.emitTypedArgs(fn, gen, method.getParameterTypes(), args); + Method m = new Method(methodName, Type.getReturnType(method), Type.getArgumentTypes(method)); + if(method.getDeclaringClass().isInterface()) + gen.invokeInterface(type, m); + else + gen.invokeVirtual(type, m); + HostExpr.emitBoxReturn(fn, gen, method.getReturnType()); + } + else + { + target.emit(C.EXPRESSION, fn, gen); + gen.push(methodName); + emitArgsAsArray(args, fn, gen); + gen.invokeStatic(REFLECTOR_TYPE, invokeInstanceMethodMethod); + } if(context == C.STATEMENT) gen.pop(); } @@ -1810,9 +1830,9 @@ 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 = cw; //ClassVisitor cv = new TraceClassVisitor(new CheckClassAdapter(cw), new PrintWriter(System.out)); -// ClassVisitor cv = new TraceClassVisitor(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(); String smap = "SMAP\n" + diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 90da621a..d8c444af 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -53,6 +53,17 @@ final static Var REFERS = final static Var IMPORTS = Var.intern(Symbol.create("clojure", "*imports*"), map(Symbol.create("RT"), "clojure.lang.RT", Symbol.create("Num"), "clojure.lang.Num", + Symbol.create("Symbol"), "clojure.lang.Symbol", + Symbol.create("Keyword"), "clojure.lang.Keyword", + Symbol.create("Var"), "clojure.lang.Var", + Symbol.create("Ref"), "clojure.lang.Ref", + Symbol.create("IFn"), "clojure.lang.IFn", + Symbol.create("IObj"), "clojure.lang.IObj", + Symbol.create("ISeq"), "clojure.lang.ISeq", + Symbol.create("IPersistentCollection"), "clojure.lang.IPersistentCollection", + Symbol.create("IPersistentMap"), "clojure.lang.IPersistentMap", + Symbol.create("IPersistentList"), "clojure.lang.IPersistentList", + Symbol.create("IPersistentVector"), "clojure.lang.IPersistentVector", Symbol.create("Boolean"), "java.lang.Boolean", Symbol.create("Byte"), "java.lang.Byte", Symbol.create("Character"), "java.lang.Character", |