diff options
-rw-r--r-- | src/clj/clojure/core.clj | 4 | ||||
-rw-r--r-- | src/clj/clojure/core_proxy.clj | 5 | ||||
-rw-r--r-- | src/clj/clojure/genclass.clj | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 21 |
4 files changed, 21 insertions, 14 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index ad1e903b..41a6aab4 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -1678,11 +1678,11 @@ (let [n (name spec) dot (.lastIndexOf n (. clojure.lang.RT (intCast \.))) c (symbol (.substring n (inc dot)))] - (. ns (importClass c (. Class (forName (name spec)))))) + (. ns (importClass c (. clojure.lang.RT (classForName (name spec)))))) (let [pkg (first spec) classes (rest spec)] (doseq [c classes] - (. ns (importClass c (. Class (forName (str pkg "." c))))))))))) + (. ns (importClass c (. clojure.lang.RT (classForName (str pkg "." c))))))))))) (defn into-array diff --git a/src/clj/clojure/core_proxy.clj b/src/clj/clojure/core_proxy.clj index bda9824a..199d4c88 100644 --- a/src/clj/clojure/core_proxy.clj +++ b/src/clj/clojure/core_proxy.clj @@ -158,7 +158,8 @@ mods (. meth (getModifiers)) mk (method-sig meth)] (if (or (considered mk) - (. Modifier (isPrivate mods)) + (not (or (Modifier/isPublic mods) (Modifier/isProtected mods))) + ;(. Modifier (isPrivate mods)) (. Modifier (isStatic mods)) (. Modifier (isFinal mods)) (= "finalize" (.getName meth))) @@ -209,7 +210,7 @@ pname (proxy-name super interfaces)] (or (RT/loadClassForName pname) (let [[cname bytecode] (generate-proxy super interfaces)] - (. RT/ROOT_CLASSLOADER (defineClass pname bytecode)))))) + (. (RT/getRootClassLoader) (defineClass pname bytecode)))))) (defn construct-proxy "Takes a proxy class and any arguments for its superclass ctor and diff --git a/src/clj/clojure/genclass.clj b/src/clj/clojure/genclass.clj index 968e2d4b..36e1d21c 100644 --- a/src/clj/clojure/genclass.clj +++ b/src/clj/clojure/genclass.clj @@ -32,7 +32,8 @@ mods (. meth (getModifiers)) mk (method-sig meth)] (if (or (considered mk) - (. Modifier (isPrivate mods)) + (not (or (Modifier/isPublic mods) (Modifier/isProtected mods))) + ;(. Modifier (isPrivate mods)) (. Modifier (isStatic mods)) (. Modifier (isFinal mods)) (= "finalize" (.getName meth))) @@ -635,6 +636,6 @@ [& options] (let [options-map (apply hash-map options) [cname bytecode] (generate-class options-map)] - (.. clojure.lang.RT ROOT_CLASSLOADER (defineClass cname bytecode)))) + (.. (clojure.lang.RT/getRootClassLoader) (defineClass cname bytecode)))) ) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 2c5faad7..4954028c 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -15,9 +15,6 @@ package clojure.lang; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.Callable; import java.util.*; -import java.util.zip.ZipEntry; -import java.util.jar.JarFile; -import java.util.jar.JarEntry; import java.util.regex.Matcher; import java.io.*; import java.lang.reflect.Array; @@ -26,7 +23,6 @@ import java.math.BigInteger; import java.security.AccessController; import java.security.PrivilegedAction; import java.net.URL; -import java.net.URLConnection; import java.net.JarURLConnection; import java.nio.charset.Charset; @@ -240,11 +236,11 @@ static public final Comparator DEFAULT_COMPARATOR = new Comparator(){ }; static AtomicInteger id = new AtomicInteger(1); -static final public DynamicClassLoader ROOT_CLASSLOADER = new DynamicClassLoader(); +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; - ROOT_CLASSLOADER.addURL(u); + getRootClassLoader().addURL(u); } static @@ -1492,6 +1488,7 @@ static public Object[] setValues(Object... vals){ static public ClassLoader makeClassLoader(){ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction(){ public Object run(){ + getRootClassLoader(); return new DynamicClassLoader(baseLoader()); } }); @@ -1500,12 +1497,14 @@ static public ClassLoader makeClassLoader(){ static public ClassLoader baseLoader(){ if(booleanCast(USE_CONTEXT_CLASSLOADER.get())) return Thread.currentThread().getContextClassLoader(); - return ROOT_CLASSLOADER; + else if(ROOT_CLASSLOADER != null) + return ROOT_CLASSLOADER; + return Compiler.class.getClassLoader(); } static public Class classForName(String name) throws ClassNotFoundException{ - return Class.forName(name, false, baseLoader()); + return Class.forName(name, true, baseLoader()); } static public Class loadClassForName(String name) throws ClassNotFoundException{ @@ -1702,4 +1701,10 @@ static final public IStream EMPTY_STREAM = new IStream(){ return eos(); } }; + +synchronized public static DynamicClassLoader getRootClassLoader() { + if(ROOT_CLASSLOADER == null) + ROOT_CLASSLOADER = new DynamicClassLoader(); + return ROOT_CLASSLOADER; + } } |