diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-05-12 19:49:46 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-05-12 19:49:46 +0000 |
commit | 288d18fa2fdb293fde171a70e5cd8d63b8c30822 (patch) | |
tree | dcf8d8f25ffdad46c39f73994f66a0e26a58027b | |
parent | 20bbbe02fd41ff11934be6344395b998ad4699e4 (diff) |
added repeatedly and add-classpath
-rw-r--r-- | src/boot.clj | 9 | ||||
-rw-r--r-- | src/jvm/clojure/lang/DynamicClassLoader.java | 16 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 9 |
3 files changed, 29 insertions, 5 deletions
diff --git a/src/boot.clj b/src/boot.clj index a7a346d7..90d702bd 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -2387,3 +2387,12 @@ not-every? (comp not every?)) (if ((bound-fn sc end-test end-key) e) s (rest s)))))) +(defn repeatedly + "Takes a function of no args, presumably with side effects, and returns an infinite + lazy sequence of calls to it" + [f] (lazy-cons (f) (repeatedly f))) + + +(defn add-classpath + "Adds the url (String or URL object) to the classpath per URLClassLoader.addURL" + [url] (clojure.lang.RT.addURL url)) diff --git a/src/jvm/clojure/lang/DynamicClassLoader.java b/src/jvm/clojure/lang/DynamicClassLoader.java index fa8f39e9..db5a6944 100644 --- a/src/jvm/clojure/lang/DynamicClassLoader.java +++ b/src/jvm/clojure/lang/DynamicClassLoader.java @@ -13,20 +13,23 @@ package clojure.lang; import java.util.HashMap; +import java.net.URLClassLoader; +import java.net.URL; //todo: possibly extend URLClassLoader? -public class DynamicClassLoader extends ClassLoader{ +public class DynamicClassLoader extends URLClassLoader{ HashMap<Integer, Object[]> constantVals = new HashMap<Integer, Object[]>(); HashMap<String, byte[]> map = new HashMap<String, byte[]>(); +static final URL[] EMPTY_URLS = new URL[]{}; public DynamicClassLoader(){ - super(Thread.currentThread().getContextClassLoader()); + super(EMPTY_URLS,Thread.currentThread().getContextClassLoader()); //super(Compiler.class.getClassLoader()); } public DynamicClassLoader(ClassLoader parent){ - super(parent); + super(EMPTY_URLS,parent); } public Class defineClass(String name, byte[] bytes){ @@ -43,7 +46,8 @@ protected Class<?> findClass(String name) throws ClassNotFoundException{ byte[] bytes = map.get(name); if(bytes != null) return defineClass(name, bytes, 0, bytes.length); - throw new ClassNotFoundException(name); + return super.findClass(name); + //throw new ClassNotFoundException(name); } public void registerConstants(int id, Object[] val){ @@ -54,4 +58,8 @@ public Object[] getConstants(int id){ return constantVals.get(id); } +public void addURL(URL url){ + super.addURL(url); +} + } diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index ff522462..4b00d928 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -22,6 +22,8 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.security.AccessController; import java.security.PrivilegedAction; +import java.net.URL; +import java.net.MalformedURLException; public class RT{ @@ -199,7 +201,12 @@ static public final Comparator DEFAULT_COMPARATOR = new Comparator(){ //static public final Character[] chars; static AtomicInteger id = new AtomicInteger(1); -static final public ClassLoader ROOT_CLASSLOADER = new DynamicClassLoader(); +static final public DynamicClassLoader ROOT_CLASSLOADER = new DynamicClassLoader(); + +static public void addURL(Object url) throws Exception{ + URL u = (url instanceof String)?(new URL((String) url)):(URL)url; + ROOT_CLASSLOADER.addURL(u); +} static { |