diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-10-12 21:31:23 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-10-12 21:31:23 +0000 |
commit | c176f33ca4ac30b577fe6d5dec43c8707d009533 (patch) | |
tree | 9c6fb2a0a0e91b283ea3bb6cf80ec12d65730912 /src | |
parent | 043093bd670d4981a3136294941831c4cfcb7bae (diff) |
first step towards AOT compilation - constants now read from strings in classfiles instead of hand-off from classloader
Diffstat (limited to 'src')
-rw-r--r-- | src/clj/clojure/boot.clj | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentMap.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentSet.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/APersistentVector.java | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/ASeq.java | 3 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 22 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 35 |
8 files changed, 61 insertions, 14 deletions
diff --git a/src/clj/clojure/boot.clj b/src/clj/clojure/boot.clj index f4625e77..34b49bc4 100644 --- a/src/clj/clojure/boot.clj +++ b/src/clj/clojure/boot.clj @@ -3567,6 +3567,8 @@ (.append w \#) (print-method (str p) w)) +(def #^{:private true} print-initialized true) + (defmacro declare "defs the supplied var names with no bindings, useful for making forward declarations." [& names] `(do ~@(map #(list 'def %) names))) diff --git a/src/jvm/clojure/lang/APersistentMap.java b/src/jvm/clojure/lang/APersistentMap.java index c9a617ed..e7a78cf1 100644 --- a/src/jvm/clojure/lang/APersistentMap.java +++ b/src/jvm/clojure/lang/APersistentMap.java @@ -25,7 +25,7 @@ protected APersistentMap(){ }
public String toString(){
- return "<map: - " + count() + " items>";
+ return RT.printString(this);
}
public IPersistentCollection cons(Object o){
diff --git a/src/jvm/clojure/lang/APersistentSet.java b/src/jvm/clojure/lang/APersistentSet.java index 7abf6608..d8345f31 100644 --- a/src/jvm/clojure/lang/APersistentSet.java +++ b/src/jvm/clojure/lang/APersistentSet.java @@ -25,6 +25,10 @@ protected APersistentSet(IPersistentMap meta, IPersistentMap impl){ this.impl = impl; } +public String toString(){ + return RT.printString(this); +} + public boolean contains(Object key){ return impl.containsKey(key); } diff --git a/src/jvm/clojure/lang/APersistentVector.java b/src/jvm/clojure/lang/APersistentVector.java index 42c9bd8f..1267b0fe 100644 --- a/src/jvm/clojure/lang/APersistentVector.java +++ b/src/jvm/clojure/lang/APersistentVector.java @@ -27,7 +27,7 @@ protected APersistentVector(){ } public String toString(){ - return "<vector: - " + count() + " items>"; + return RT.printString(this); } public ISeq seq(){ diff --git a/src/jvm/clojure/lang/ASeq.java b/src/jvm/clojure/lang/ASeq.java index a85ae24a..e2d126e7 100644 --- a/src/jvm/clojure/lang/ASeq.java +++ b/src/jvm/clojure/lang/ASeq.java @@ -16,6 +16,9 @@ import java.util.Iterator; public abstract class ASeq extends Obj implements ISeq, Collection{
transient int _hash = -1;
+public String toString(){
+ return RT.printString(this);
+}
public IPersistentCollection empty(){
return null;
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 2dd92a25..605a1586 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -2854,6 +2854,7 @@ static public class FnExpr implements Expr{ final static Method getClassMethod = Method.getMethod("Class getClass()"); final static Method getClassLoaderMethod = Method.getMethod("ClassLoader getClassLoader()"); final static Method getConstantsMethod = Method.getMethod("Object[] getConstants(int)"); + final static Method readStringMethod = Method.getMethod("Object readString(String)"); private DynamicClassLoader loader; private byte[] bytecode; @@ -2935,7 +2936,7 @@ static public class FnExpr implements Expr{ fn.constants = (PersistentVector) CONSTANTS.get(); fn.constantsID = RT.nextID(); DynamicClassLoader loader = (DynamicClassLoader) LOADER.get(); - loader.registerConstants(fn.constantsID, fn.constants.toArray()); + //loader.registerConstants(fn.constantsID, fn.constants.toArray()); } finally { @@ -3032,18 +3033,21 @@ static public class FnExpr implements Expr{ if(constants.count() > 0) { + // clinitgen.mark(begin); - clinitgen.visitLdcInsn(fntype); - clinitgen.invokeVirtual(CLASS_TYPE, getClassLoaderMethod); - clinitgen.checkCast(DYNAMIC_CLASSLOADER_TYPE); - clinitgen.push(constantsID); - clinitgen.invokeVirtual(DYNAMIC_CLASSLOADER_TYPE, getConstantsMethod); +// clinitgen.visitLdcInsn(fntype); +// clinitgen.invokeVirtual(CLASS_TYPE, getClassLoaderMethod); +// clinitgen.checkCast(DYNAMIC_CLASSLOADER_TYPE); +// clinitgen.push(constantsID); +// clinitgen.invokeVirtual(DYNAMIC_CLASSLOADER_TYPE, getConstantsMethod); for(int i = 0; i < constants.count(); i++) { - clinitgen.dup(); - clinitgen.push(i); - clinitgen.arrayLoad(OBJECT_TYPE); + clinitgen.push(RT.printString(constants.nth(i))); + clinitgen.invokeStatic(RT_TYPE, readStringMethod); +// clinitgen.dup(); +// clinitgen.push(i); +// clinitgen.arrayLoad(OBJECT_TYPE); clinitgen.checkCast(constantType(i)); clinitgen.putStatic(fntype, constantName(i), constantType(i)); } diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 702eea0c..3107eda4 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -50,6 +50,7 @@ static Pattern intPat = static Pattern ratioPat = Pattern.compile("([-+]?[0-9]+)/([0-9]+)");
static Pattern floatPat = Pattern.compile("[-+]?[0-9]+(\\.[0-9]+)?([eE][-+]?[0-9]+)?[M]?");
static final Symbol SLASH = Symbol.create("/");
+static final Symbol CLOJURE_SLASH = Symbol.create("clojure","/");
//static Pattern accessorPat = Pattern.compile("\\.[a-zA-Z_]\\w*");
//static Pattern instanceMemberPat = Pattern.compile("\\.([a-zA-Z_][\\w\\.]*)\\.([a-zA-Z_]\\w*)");
//static Pattern staticMemberPat = Pattern.compile("([a-zA-Z_][\\w\\.]*)\\.([a-zA-Z_]\\w*)");
@@ -268,6 +269,10 @@ static private Object interpretToken(String s) throws Exception{ {
return SLASH;
}
+ else if(s.equals("clojure//"))
+ {
+ return CLOJURE_SLASH;
+ }
Object ret = null;
ret = matchSymbol(s);
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 30b9ed31..9982ebbf 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -205,6 +205,7 @@ final static Var ALLOW_UNRESOLVED_VARS = Var.intern(CLOJURE_NS, Symbol.create("* final static Var IN_NS_VAR = Var.intern(CLOJURE_NS, Symbol.create("in-ns"), F); final static Var NS_VAR = Var.intern(CLOJURE_NS, Symbol.create("ns"), F); +static final Var PRINT_INITIALIZED = Var.intern(CLOJURE_NS, Symbol.create("print-initialized")); static final Var PRINT_METHOD = Var.intern(CLOJURE_NS, Symbol.create("print-method")); //final static Var IMPORTS = Var.intern(CLOJURE_NS, Symbol.create("*imports*"), DEFAULT_IMPORTS); final static IFn inNamespace = new AFn(){ @@ -1159,11 +1160,37 @@ static public boolean suppressRead(){ return false; } +static public String printString(Object x) { + try + { + StringWriter sw = new StringWriter(); + print(x,sw); + return sw.toString(); + } + catch(Exception e) + { + throw new RuntimeException(e); + } +} + +static public Object readString(String s){ + PushbackReader r = new PushbackReader(new StringReader(s)); + try + { + return LispReader.read(r,true,null,false); + } + catch(Exception e) + { + throw new RuntimeException(e); + } +} static public void print(Object x, Writer w) throws Exception{ //call multimethod - PRINT_METHOD.invoke(x, w); -/* + if(PRINT_INITIALIZED.isBound()) + PRINT_METHOD.invoke(x, w); +//* + else{ boolean readably = booleanCast(PRINT_READABLY.get()); if(x instanceof Obj) { @@ -1317,6 +1344,7 @@ static public void print(Object x, Writer w) throws Exception{ } else if(x instanceof Class) { + w.write("#="); w.write(((Class) x).getName()); } else if(x instanceof BigDecimal && readably) @@ -1325,7 +1353,8 @@ static public void print(Object x, Writer w) throws Exception{ w.write('M'); } else w.write(x.toString()); - */ + } + //*/ } private static void printInnerSeq(ISeq x, Writer w) throws Exception{ |