diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-11-18 03:30:57 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-11-18 03:30:57 +0000 |
commit | 97c187fbae66df23d6716538b64ba46d67847792 (patch) | |
tree | 851d388390c4b295aa4093ef588c0554f0e35314 /src/jvm/clojure | |
parent | 2f66b5c5290fbc7ff2b02365a3530cefb7e991d4 (diff) |
AOT init refinements
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 43 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 14 |
2 files changed, 47 insertions, 10 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 4af1cf30..9b9b0195 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -185,7 +185,7 @@ static final public Var COMPILE_PATH = Var.intern(Namespace.findOrCreate(Symbol. Symbol.create("*compile-path*"), null); //boolean static final public Var COMPILE_FILES = Var.intern(Namespace.findOrCreate(Symbol.create("clojure.core")), - Symbol.create("*compile-files*"), RT.F); + Symbol.create("*compile-files*"), Boolean.FALSE); //Integer static final public Var LINE = Var.create(0); @@ -2944,8 +2944,8 @@ static public class FnExpr implements Expr{ fn.vars = (IPersistentMap) VARS.get(); fn.constants = (PersistentVector) CONSTANTS.get(); fn.constantsID = RT.nextID(); - DynamicClassLoader loader = (DynamicClassLoader) LOADER.get(); - loader.registerConstants(fn.constantsID, fn.constants.toArray()); +// DynamicClassLoader loader = (DynamicClassLoader) LOADER.get(); +// loader.registerConstants(fn.constantsID, fn.constants.toArray()); } finally { @@ -3167,9 +3167,13 @@ static public class FnExpr implements Expr{ if(compiledClass == null) try { - //compiledClass = RT.classForName(name);//loader.defineClass(name, bytecode); - loader = (DynamicClassLoader) LOADER.get(); - compiledClass = loader.defineClass(name, bytecode); + if(RT.booleanCast(COMPILE_FILES.get())) + compiledClass = RT.classForName(name);//loader.defineClass(name, bytecode); + else + { + loader = (DynamicClassLoader) LOADER.get(); + compiledClass = loader.defineClass(name, bytecode); + } } catch(Exception e) { @@ -4454,6 +4458,11 @@ static public void writeClassFile(String internalName, byte[] bytecode) throws E } } +static void pushNS(){ + Var.pushThreadBindings(PersistentHashMap.create(Var.intern(Symbol.create("clojure.core"), + Symbol.create("*ns*")),null)); +} + public static Object compile(Reader rdr, String sourcePath, String sourceName) throws Exception{ if(COMPILE_PATH.get() == null) throw new Exception("*compile-path* not set"); @@ -4521,10 +4530,29 @@ public static Object compile(Reader rdr, String sourcePath, String sourceName) t null, cv); clinitgen.visitCode(); + Label startTry = clinitgen.newLabel(); + Label endTry = clinitgen.newLabel(); + Label end = clinitgen.newLabel(); + Label finallyLabel = clinitgen.newLabel(); + if(fn.constants.count() > 0) { fn.emitConstants(clinitgen); } + clinitgen.invokeStatic(Type.getType(Compiler.class), Method.getMethod("void pushNS()")); + clinitgen.mark(startTry); + clinitgen.invokeStatic(fn.fntype, Method.getMethod("void load()")); + clinitgen.mark(endTry); + clinitgen.invokeStatic(VAR_TYPE, Method.getMethod("void popThreadBindings()")); + clinitgen.goTo(end); + + clinitgen.mark(finallyLabel); + //exception should be on stack + clinitgen.invokeStatic(VAR_TYPE, Method.getMethod("void popThreadBindings()")); + clinitgen.throwException(); + clinitgen.mark(end); + clinitgen.visitTryCatchBlock(startTry, endTry, finallyLabel, null); + //end of static init clinitgen.returnValue(); clinitgen.endMethod(); @@ -4536,9 +4564,6 @@ public static Object compile(Reader rdr, String sourcePath, String sourceName) t null, cv); maingen.visitCode(); - maingen.push(fn.internalName); - maingen.push(true); - maingen.invokeStatic(RT_TYPE, Method.getMethod("void load(String,boolean)")); maingen.push(fn.internalName.replace('/', '.')); maingen.push("main"); maingen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var var(String,String)")); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index dc4451a6..e714b80e 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -290,6 +290,8 @@ static CURRENT_NS.setTag(Symbol.create("clojure.lang.Namespace")); AGENT.setTag(Symbol.create("clojure.lang.Agent")); MATH_CONTEXT.setTag(Symbol.create("java.math.MathContext")); + //during bootstrap ns same as in-ns + Var.intern(CLOJURE_NS, NAMESPACE, inNamespace); Var v; v = Var.intern(CLOJURE_NS, IN_NAMESPACE, inNamespace); v.setMeta(map(dockw, "Sets *ns* to the namespace named by the symbol, creating it if needed.", @@ -437,7 +439,7 @@ static public void load(String scriptbase, boolean failIfNotFound) throws Except Var.pushThreadBindings( RT.map(CURRENT_NS, CURRENT_NS.get(), WARN_ON_REFLECTION, WARN_ON_REFLECTION.get())); - Reflector.invokeStaticMethod(classForName(scriptbase.replace('/','.')), "load", EMPTY_ARRAY); + loadClassForName(scriptbase.replace('/','.')); } finally { @@ -1613,6 +1615,16 @@ static public Class classForName(String name) throws ClassNotFoundException{ return Class.forName(name, false, baseLoader()); } +static public boolean loadClassForName(String name) throws ClassNotFoundException{ + try{ + Class.forName(name, true, baseLoader()); + } + catch(Exception e) + { + return false; + } + return true; +} static public float aget(float[] xs, int i){ return xs[i]; |