summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-05-27 17:54:36 +0000
committerRich Hickey <richhickey@gmail.com>2009-05-27 17:54:36 +0000
commitb045a379215d1f48e6a2e6cedcdb41526cd5bb25 (patch)
tree1b373847ae6ba72892d9ca46e3d089a3e5712361
parentd0fe0d1c544fb4d8d05ba3c7b6bf83fc2f4692a3 (diff)
get rid of root classloader. Establish dynamic context classloader for repl thread. Default true for *use-context-classloader*
-rw-r--r--src/clj/clojure/main.clj2
-rw-r--r--src/jvm/clojure/lang/RT.java19
2 files changed, 8 insertions, 13 deletions
diff --git a/src/clj/clojure/main.clj b/src/clj/clojure/main.clj
index 176fa13f..ee185afe 100644
--- a/src/clj/clojure/main.clj
+++ b/src/clj/clojure/main.clj
@@ -154,6 +154,8 @@
read, eval, or print throws an exception or error
default: repl-caught"
[& options]
+ (let [cl (.getContextClassLoader (Thread/currentThread))]
+ (.setContextClassLoader (Thread/currentThread) (clojure.lang.DynamicClassLoader. cl)))
(let [{:keys [init need-prompt prompt flush read eval print caught]
:or {init #()
need-prompt (if (instance? LineNumberingPushbackReader *in*)
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index f4623591..5d683e48 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -184,7 +184,7 @@ final static public Var MATH_CONTEXT = Var.intern(CLOJURE_NS, Symbol.create("*ma
static Keyword LINE_KEY = Keyword.intern(null, "line");
static Keyword FILE_KEY = Keyword.intern(null, "file");
final static public Var USE_CONTEXT_CLASSLOADER =
- Var.intern(CLOJURE_NS, Symbol.create("*use-context-classloader*"), null);
+ Var.intern(CLOJURE_NS, Symbol.create("*use-context-classloader*"), T);
//final static public Var CURRENT_MODULE = Var.intern(Symbol.create("clojure.core", "current-module"),
// Module.findOrCreateModule("clojure/user"));
@@ -236,11 +236,14 @@ static public final Comparator DEFAULT_COMPARATOR = new Comparator(){
};
static AtomicInteger id = new AtomicInteger(1);
-private static DynamicClassLoader ROOT_CLASSLOADER = null;
static public void addURL(Object url) throws Exception{
URL u = (url instanceof String) ? (new URL((String) url)) : (URL) url;
- getRootClassLoader().addURL(u);
+ ClassLoader ccl = Thread.currentThread().getContextClassLoader();
+ if(ccl instanceof DynamicClassLoader)
+ ((DynamicClassLoader)ccl).addURL(u);
+ else
+ throw new IllegalAccessError("Context classloader is not a DynamicClassLoader");
}
final static public Object EOS = new Object();
@@ -1485,8 +1488,6 @@ static public ClassLoader baseLoader(){
return (ClassLoader) Compiler.LOADER.deref();
else if(booleanCast(USE_CONTEXT_CLASSLOADER.deref()))
return Thread.currentThread().getContextClassLoader();
- else if(ROOT_CLASSLOADER != null)
- return ROOT_CLASSLOADER;
return Compiler.class.getClassLoader();
}
@@ -1673,12 +1674,4 @@ static public int alength(Object xs){
return Array.getLength(xs);
}
-
-
-
-synchronized public static DynamicClassLoader getRootClassLoader(){
- if(ROOT_CLASSLOADER == null)
- ROOT_CLASSLOADER = new DynamicClassLoader();
- return ROOT_CLASSLOADER;
-}
}