summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-16 17:09:52 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-16 17:09:52 +0000
commit414f12b134344baee0f5d183551d24b577ec66a5 (patch)
treea9369b9ed33a189af48acf61cfd6b117a115a43c
parentd041b1fe404e73fb01ee572825d32a1d9df731d7 (diff)
interim checkin
-rw-r--r--src/boot.clj12
-rw-r--r--src/jvm/clojure/lang/Compiler.java32
-rw-r--r--src/jvm/clojure/lang/RT.java11
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",