diff options
-rw-r--r-- | src/clj/clojure/core.clj | 7 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 43 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 14 |
3 files changed, 51 insertions, 13 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index c0174c05..a6d7ca2e 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -2394,7 +2394,7 @@ "Evaluates body in a context in which *in* is bound to a fresh StringReader initialized with the string s." [s & body] - `(with-open s# (-> (java.io.StringReader. ~s) clojure.lang.LineNumberingPushbackReader.) + `(with-open [s# (-> (java.io.StringReader. ~s) clojure.lang.LineNumberingPushbackReader.)] (binding [*in* s#] ~@body))) @@ -3100,10 +3100,11 @@ (let [process-reference (fn [[kname & args]] `(~(symbol "clojure.core" (clojure.core/name kname)) - ~@(map #(list 'quote %) args)))] + ~@(map #(list 'quote %) args))) + references (remove #(= :gen-class (first %)) references)] `(do (clojure.core/in-ns '~name) - ~@(when (not-any? #(= :refer-clojure (first %)) references) + ~@(when (and (not= name '~'clojure.core) (not-any? #(= :refer-clojure (first %)) references)) `((clojure.core/refer '~'clojure.core))) ~@(map process-reference references)))) 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]; |