diff options
author | jfrijters <jfrijters> | 2013-02-23 12:50:01 +0400 |
---|---|---|
committer | jfrijters <jfrijters> | 2013-02-23 12:50:01 +0400 |
commit | d1e2edf7c3422042065fddb61564e02b7db491ae (patch) | |
tree | 17e23547ff1ff02c90039b5babe16c2cbef066f0 | |
parent | 162e81bddafea662b342ef78a7d53995a87551ec (diff) |
Remove Assembly field from AssemblyClassLoader, instead associate the ikvm.runtime.AssemblyClassLoader with the runtime AssemblyClassLoader.
-rw-r--r-- | classpath/ikvm/internal/AssemblyClassLoader.java | 59 | ||||
-rw-r--r-- | runtime/AssemblyClassLoader.cs | 2 | ||||
-rw-r--r-- | runtime/ClassLoaderWrapper.cs | 2 | ||||
-rw-r--r-- | runtime/common.cs | 49 |
4 files changed, 67 insertions, 45 deletions
diff --git a/classpath/ikvm/internal/AssemblyClassLoader.java b/classpath/ikvm/internal/AssemblyClassLoader.java index 86a42cee..00d79de2 100644 --- a/classpath/ikvm/internal/AssemblyClassLoader.java +++ b/classpath/ikvm/internal/AssemblyClassLoader.java @@ -37,58 +37,52 @@ import java.util.jar.Manifest; public final class AssemblyClassLoader extends ClassLoader { - private final Assembly assembly; private boolean packagesDefined; + // This constructor is used to manually construct an AssemblyClassLoader that is used + // as a delegation parent for custom assembly class loaders. + // + // In that case the class loader object graph looks like this: + // + // +---------------------------------+ + // |IKVM.Internal.AssemblyClassLoader| + // +---------------------------------+ + // || /\ /\ + // \/ || || + // +-------------------+ || + // |Custom Class Loader| +--------------------------------+ + // +-------------------+ |ikvm.runtime.AssemblyClassLoader| + // +--------------------------------+ + // public AssemblyClassLoader(Assembly assembly) { super(null); - this.assembly = assembly; + setWrapper(assembly); } + private native void setWrapper(Assembly assembly); + // this constructor is used by the runtime and calls a privileged // ClassLoader constructor to avoid the security check - AssemblyClassLoader(Assembly assembly, SecurityManager security) + AssemblyClassLoader() { super(null, null); - this.assembly = assembly; } @Override - protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException - { - return LoadClass(this, assembly, name); - } - - private static native Class LoadClass(ClassLoader classLoader, Assembly assembly, String name) throws ClassNotFoundException; + protected native Class loadClass(String name, boolean resolve) throws ClassNotFoundException; @Override - public URL getResource(String name) - { - return getResource(assembly, name); - } + public native URL getResource(String name); @Override - public Enumeration getResources(String name) throws IOException - { - return getResources(assembly, name); - } + public native Enumeration<URL> getResources(String name) throws IOException; @Override - protected URL findResource(String name) - { - return getResource(assembly, name); - } + protected native URL findResource(String name); @Override - protected Enumeration findResources(String name) throws IOException - { - return getResources(assembly, name); - } - - private static native URL getResource(Assembly assembly, String name); - - private static native Enumeration getResources(Assembly assembly, String name) throws IOException; + protected native Enumeration<URL> findResources(String name) throws IOException; private synchronized void lazyDefinePackagesCheck() { @@ -116,10 +110,7 @@ public final class AssemblyClassLoader extends ClassLoader } @Override - public String toString() - { - return assembly.get_FullName(); - } + public native String toString(); // return the ClassLoader for the assembly. Note that this doesn't have to be an AssemblyClassLoader. public static native ClassLoader getAssemblyClassLoader(Assembly asm); diff --git a/runtime/AssemblyClassLoader.cs b/runtime/AssemblyClassLoader.cs index 31f2a027..960beead 100644 --- a/runtime/AssemblyClassLoader.cs +++ b/runtime/AssemblyClassLoader.cs @@ -1213,7 +1213,7 @@ namespace IKVM.Internal } if (jclcip.javaClassLoader == null) { - jclcip.javaClassLoader = new ikvm.runtime.AssemblyClassLoader(assembly, null); + jclcip.javaClassLoader = new ikvm.runtime.AssemblyClassLoader(); SetWrapperForClassLoader(jclcip.javaClassLoader, this); } // finally we publish the class loader for other threads to see diff --git a/runtime/ClassLoaderWrapper.cs b/runtime/ClassLoaderWrapper.cs index 81eeb846..813e41f6 100644 --- a/runtime/ClassLoaderWrapper.cs +++ b/runtime/ClassLoaderWrapper.cs @@ -1138,7 +1138,7 @@ namespace IKVM.Internal } #if !STATIC_COMPILER && !STUB_GENERATOR - protected static void SetWrapperForClassLoader(java.lang.ClassLoader javaClassLoader, ClassLoaderWrapper wrapper) + protected internal static void SetWrapperForClassLoader(java.lang.ClassLoader javaClassLoader, ClassLoaderWrapper wrapper) { #if __MonoCS__ || FIRST_PASS typeof(java.lang.ClassLoader).GetField("wrapper", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(javaClassLoader, wrapper); diff --git a/runtime/common.cs b/runtime/common.cs index beea1fe3..e881b403 100644 --- a/runtime/common.cs +++ b/runtime/common.cs @@ -208,7 +208,12 @@ namespace IKVM.NativeCode.ikvm.runtime { static class AssemblyClassLoader { - public static global::java.lang.Class LoadClass(global::java.lang.ClassLoader classLoader, Assembly assembly, string name) + public static void setWrapper(global::java.lang.ClassLoader _this, Assembly assembly) + { + ClassLoaderWrapper.SetWrapperForClassLoader(_this, IKVM.Internal.AssemblyClassLoader.FromAssembly(assembly)); + } + + public static global::java.lang.Class loadClass(global::java.lang.ClassLoader _this, string name, bool resolve) { #if !FIRST_PASS if (!global::java.lang.ClassLoader.checkName(name)) @@ -218,26 +223,26 @@ namespace IKVM.NativeCode.ikvm.runtime #endif try { - IKVM.Internal.AssemblyClassLoader wrapper = IKVM.Internal.AssemblyClassLoader.FromAssembly(assembly); + AssemblyClassLoader_ wrapper = (AssemblyClassLoader_)ClassLoaderWrapper.GetClassLoaderWrapper(_this); TypeWrapper tw = wrapper.LoadClass(name); if(tw == null) { throw new ClassNotFoundException(name); } - Tracer.Info(Tracer.ClassLoading, "Loaded class \"{0}\" from {1}", name, classLoader == null ? "boot class loader" : (object)classLoader); + Tracer.Info(Tracer.ClassLoading, "Loaded class \"{0}\" from {1}", name, _this); return tw.ClassObject; } catch(RetargetableJavaException x) { - Tracer.Info(Tracer.ClassLoading, "Failed to load class \"{0}\" from {1}", name, classLoader == null ? "boot class loader" : (object)classLoader); + Tracer.Info(Tracer.ClassLoading, "Failed to load class \"{0}\" from {1}", name, _this); throw x.ToJava(); } } - public static global::java.net.URL getResource(Assembly assembly, string name) + public static global::java.net.URL getResource(global::java.lang.ClassLoader _this, string name) { #if !FIRST_PASS - IKVM.Internal.AssemblyClassLoader wrapper = IKVM.Internal.AssemblyClassLoader.FromAssembly(assembly); + AssemblyClassLoader_ wrapper = (AssemblyClassLoader_)ClassLoaderWrapper.GetClassLoaderWrapper(_this); foreach (global::java.net.URL url in wrapper.GetResources(name)) { return url; @@ -246,12 +251,33 @@ namespace IKVM.NativeCode.ikvm.runtime return null; } - public static global::java.util.Enumeration getResources(Assembly assembly, string name) + public static global::java.util.Enumeration getResources(global::java.lang.ClassLoader _this, string name) { #if FIRST_PASS return null; #else - return new global::ikvm.runtime.EnumerationWrapper(IKVM.Internal.AssemblyClassLoader.FromAssembly(assembly).GetResources(name)); + return new global::ikvm.runtime.EnumerationWrapper(((AssemblyClassLoader_)ClassLoaderWrapper.GetClassLoaderWrapper(_this)).GetResources(name)); +#endif + } + + public static global::java.net.URL findResource(global::java.lang.ClassLoader _this, string name) + { +#if !FIRST_PASS + AssemblyClassLoader_ wrapper = (AssemblyClassLoader_)ClassLoaderWrapper.GetClassLoaderWrapper(_this); + foreach (global::java.net.URL url in wrapper.FindResources(name)) + { + return url; + } +#endif + return null; + } + + public static global::java.util.Enumeration findResources(global::java.lang.ClassLoader _this, string name) + { +#if FIRST_PASS + return null; +#else + return new global::ikvm.runtime.EnumerationWrapper(((AssemblyClassLoader_)ClassLoaderWrapper.GetClassLoaderWrapper(_this)).FindResources(name)); #endif } @@ -275,7 +301,7 @@ namespace IKVM.NativeCode.ikvm.runtime { try { - global::java.net.URL url = _this.findResource("META-INF/MANIFEST.MF"); + global::java.net.URL url = findResource(_this, "META-INF/MANIFEST.MF"); if (url != null) { return new global::java.util.jar.Manifest(url.openStream()); @@ -340,6 +366,11 @@ namespace IKVM.NativeCode.ikvm.runtime #endif } + public static string toString(global::java.lang.ClassLoader _this) + { + return ((AssemblyClassLoader_)ClassLoaderWrapper.GetClassLoaderWrapper(_this)).MainAssembly.FullName; + } + public static global::java.lang.ClassLoader getAssemblyClassLoader(Assembly asm) { // note that we don't do a security check here, because if you have the Assembly object, |