diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 12 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 35 | ||||
-rw-r--r-- | src/proxy.clj | 4 |
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)) |