summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-10-12 21:31:23 +0000
committerRich Hickey <richhickey@gmail.com>2008-10-12 21:31:23 +0000
commitc176f33ca4ac30b577fe6d5dec43c8707d009533 (patch)
tree9c6fb2a0a0e91b283ea3bb6cf80ec12d65730912 /src
parent043093bd670d4981a3136294941831c4cfcb7bae (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.clj2
-rw-r--r--src/jvm/clojure/lang/APersistentMap.java2
-rw-r--r--src/jvm/clojure/lang/APersistentSet.java4
-rw-r--r--src/jvm/clojure/lang/APersistentVector.java2
-rw-r--r--src/jvm/clojure/lang/ASeq.java3
-rw-r--r--src/jvm/clojure/lang/Compiler.java22
-rw-r--r--src/jvm/clojure/lang/LispReader.java5
-rw-r--r--src/jvm/clojure/lang/RT.java35
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{