diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-05-27 17:54:36 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-05-27 17:54:36 +0000 |
commit | b045a379215d1f48e6a2e6cedcdb41526cd5bb25 (patch) | |
tree | 1b373847ae6ba72892d9ca46e3d089a3e5712361 /src | |
parent | d0fe0d1c544fb4d8d05ba3c7b6bf83fc2f4692a3 (diff) |
get rid of root classloader. Establish dynamic context classloader for repl thread. Default true for *use-context-classloader*
Diffstat (limited to 'src')
-rw-r--r-- | src/clj/clojure/main.clj | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 19 |
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; -} } |