summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/clj/clojure/core.clj7
-rw-r--r--src/jvm/clojure/lang/Compiler.java43
-rw-r--r--src/jvm/clojure/lang/RT.java14
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];