summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java12
-rw-r--r--src/jvm/clojure/lang/RT.java35
-rw-r--r--src/proxy.clj4
3 files changed, 41 insertions, 10 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 81bbc233..3f5d474a 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -723,7 +723,7 @@ static public abstract class HostExpr implements Expr{
if(sym.ns == null) //if ns-qualified can't be classname
{
if(sym.name.indexOf('.') > 0 || sym.name.charAt(0) == '[')
- c = Class.forName(sym.name);
+ c = RT.classForName(sym.name);
else
{
Object o = currentNS().getMapping(sym);
@@ -733,7 +733,7 @@ static public abstract class HostExpr implements Expr{
}
}
else if(stringOk && form instanceof String)
- c = Class.forName((String) form);
+ c = RT.classForName((String) form);
return c;
}
@@ -1694,6 +1694,7 @@ static class ThrowExpr extends UntypedExpr{
}
}
+/*
static class ClassExpr implements Expr{
final Class c;
final static Method forNameMethod = Method.getMethod("Class forName(String)");
@@ -1736,6 +1737,7 @@ static class ClassExpr implements Expr{
}
}
}
+*/
static boolean subsumes(Class[] c1, Class[] c2){
//presumes matching lengths
@@ -1847,7 +1849,7 @@ static class NewExpr implements Expr{
else
{
gen.push(c.getName());
- gen.invokeStatic(CLASS_TYPE, forNameMethod);
+ gen.invokeStatic(RT_TYPE, forNameMethod);
MethodExpr.emitArgsAsArray(args, fn, gen);
if(context == C.RETURN)
{
@@ -3529,7 +3531,7 @@ static public Object resolveIn(Namespace n, Symbol sym) throws Exception{
}
else if(sym.name.indexOf('.') > 0 || sym.name.charAt(0) == '[')
{
- return Class.forName(sym.name);
+ return RT.classForName(sym.name);
}
else
{
@@ -3554,7 +3556,7 @@ static public Object maybeResolveIn(Namespace n, Symbol sym) throws Exception{
}
else if(sym.name.indexOf('.') > 0 || sym.name.charAt(0) == '[')
{
- return Class.forName(sym.name);
+ return RT.classForName(sym.name);
}
else
{
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index e4ced035..53657635 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -199,6 +199,7 @@ 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
{
@@ -262,8 +263,11 @@ static public Var var(String ns, String name){
public static void loadResourceScript(String name) throws Exception{
InputStream ins = RT.class.getResourceAsStream("/" + name);
- Compiler.load(new InputStreamReader(ins), name, name);
- ins.close();
+ if(ins != null)
+ {
+ Compiler.load(new InputStreamReader(ins), name, name);
+ ins.close();
+ }
}
static public void init() throws Exception{
@@ -276,6 +280,25 @@ static void doInit() throws Exception{
loadResourceScript("zip.clj");
loadResourceScript("xml.clj");
loadResourceScript("set.clj");
+
+ Var.pushThreadBindings(
+ RT.map(CURRENT_NS, CURRENT_NS.get(),
+ WARN_ON_REFLECTION, WARN_ON_REFLECTION.get()));
+ try
+ {
+ Symbol USER = Symbol.create("user");
+ Symbol CLOJURE = Symbol.create("clojure");
+
+ Var in_ns = var("clojure", "in-ns");
+ Var refer = var("clojure", "refer");
+ in_ns.invoke(USER);
+ refer.invoke(CLOJURE);
+ loadResourceScript("user.clj");
+ }
+ finally
+ {
+ Var.popThreadBindings();
+ }
}
static public int nextID(){
@@ -1131,11 +1154,17 @@ static public Object[] setValues(Object... vals){
return null;
}
+
static public ClassLoader makeClassLoader(){
return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction(){
public Object run(){
- return new DynamicClassLoader();
+ return new DynamicClassLoader(ROOT_CLASSLOADER);
}
});
}
+
+static public Class classForName(String name) throws ClassNotFoundException{
+ return Class.forName(name, false, RT.ROOT_CLASSLOADER);
+}
+
}
diff --git a/src/proxy.clj b/src/proxy.clj
index c49cbdf0..ca9bb13a 100644
--- a/src/proxy.clj
+++ b/src/proxy.clj
@@ -11,7 +11,7 @@
'(clojure.asm ClassWriter ClassVisitor Opcodes Type)
'(java.lang.reflect Modifier Constructor)
'(clojure.asm.commons Method GeneratorAdapter)
- '(clojure.lang IProxy Reflector DynamicClassLoader IPersistentMap PersistentHashMap))
+ '(clojure.lang IProxy Reflector DynamicClassLoader IPersistentMap PersistentHashMap RT))
(def *proxy-classes* (ref {}))
@@ -183,7 +183,7 @@
;finish class def
(. cv (visitEnd))
;generate, cache and return class object
- (let [loader (new DynamicClassLoader)
+ (let [loader (RT.ROOT_CLASSLOADER)
c (. loader (defineClass (. cname (replace "/" "."))
(. cv (toByteArray))))]
(sync nil (commute *proxy-classes* assoc bases c))