summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-05-12 19:49:46 +0000
committerRich Hickey <richhickey@gmail.com>2008-05-12 19:49:46 +0000
commit288d18fa2fdb293fde171a70e5cd8d63b8c30822 (patch)
treedcf8d8f25ffdad46c39f73994f66a0e26a58027b
parent20bbbe02fd41ff11934be6344395b998ad4699e4 (diff)
added repeatedly and add-classpath
-rw-r--r--src/boot.clj9
-rw-r--r--src/jvm/clojure/lang/DynamicClassLoader.java16
-rw-r--r--src/jvm/clojure/lang/RT.java9
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
{