Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2013-02-23 12:50:01 +0400
committerjfrijters <jfrijters>2013-02-23 12:50:01 +0400
commitd1e2edf7c3422042065fddb61564e02b7db491ae (patch)
tree17e23547ff1ff02c90039b5babe16c2cbef066f0
parent162e81bddafea662b342ef78a7d53995a87551ec (diff)
Remove Assembly field from AssemblyClassLoader, instead associate the ikvm.runtime.AssemblyClassLoader with the runtime AssemblyClassLoader.
-rw-r--r--classpath/ikvm/internal/AssemblyClassLoader.java59
-rw-r--r--runtime/AssemblyClassLoader.cs2
-rw-r--r--runtime/ClassLoaderWrapper.cs2
-rw-r--r--runtime/common.cs49
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,