зеркало из https://github.com/mono/ikvm-fork.git
Added AssemblyClassLoader.GetAssembly(TypeWrapper) and changed most code that assumed that an AssemblyClassLoader represented a single assembly to use it.
This commit is contained in:
Родитель
c84bf959b6
Коммит
5eebd6f17b
|
@ -128,12 +128,7 @@ public final class AssemblyClassLoader extends ClassLoader
|
|||
}
|
||||
if(c != null)
|
||||
{
|
||||
classLoader = c.getClassLoader();
|
||||
if(classLoader == null)
|
||||
{
|
||||
return makeIkvmresURL(GetBootClassLoaderAssembly(), name);
|
||||
}
|
||||
assembly = GetAssemblyFromClassLoader(classLoader);
|
||||
assembly = GetAssemblyFromClass(c);
|
||||
if(assembly != null)
|
||||
{
|
||||
return makeIkvmresURL(assembly, name);
|
||||
|
@ -144,7 +139,7 @@ public final class AssemblyClassLoader extends ClassLoader
|
|||
// TODO this obviously isn't persistable, we should use a list of assemblies instead.
|
||||
try
|
||||
{
|
||||
return new URL("ikvmres", "gen", GetGenericClassLoaderId(classLoader), "/" + name);
|
||||
return new URL("ikvmres", "gen", GetGenericClassLoaderId(c.getClassLoader()), "/" + name);
|
||||
}
|
||||
catch(MalformedURLException x)
|
||||
{
|
||||
|
@ -159,9 +154,8 @@ public final class AssemblyClassLoader extends ClassLoader
|
|||
private static native boolean IsReflectionOnly(Assembly asm);
|
||||
private static native Assembly[] FindResourceAssemblies(Assembly assembly, String name, boolean firstOnly);
|
||||
private static native int GetGenericClassLoaderId(ClassLoader classLoader);
|
||||
private static native Assembly GetBootClassLoaderAssembly();
|
||||
private static native String GetGenericClassLoaderName(Object classLoader);
|
||||
private static native Assembly GetAssemblyFromClassLoader(ClassLoader classLoader);
|
||||
private static native Assembly GetAssemblyFromClass(Class clazz);
|
||||
// also used by VMClassLoader
|
||||
@Internal
|
||||
public static native String[] GetPackages(Assembly assembly);
|
||||
|
|
|
@ -2778,7 +2778,7 @@ namespace IKVM.Internal
|
|||
{
|
||||
if(!(loader is GenericClassLoader || loader is CompilerClassLoader || (importedStubTypes.ContainsKey(s) && importedStubTypes[s] == wrapper)))
|
||||
{
|
||||
StaticCompiler.IssueMessage(Message.SkippingReferencedClass, s, ((AssemblyClassLoader)loader).Assembly.FullName);
|
||||
StaticCompiler.IssueMessage(Message.SkippingReferencedClass, s, ((AssemblyClassLoader)loader).GetAssembly(wrapper).FullName);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -1712,6 +1712,12 @@ namespace IKVM.Internal
|
|||
}
|
||||
}
|
||||
|
||||
internal Assembly GetAssembly(TypeWrapper wrapper)
|
||||
{
|
||||
Debug.Assert(wrapper.GetClassLoader() == this);
|
||||
return wrapper.TypeAsBaseType.Assembly;
|
||||
}
|
||||
|
||||
internal override Type GetGenericTypeDefinition(string name)
|
||||
{
|
||||
try
|
||||
|
|
|
@ -142,11 +142,12 @@ namespace IKVM.NativeCode.ikvm.@internal
|
|||
{
|
||||
public static string getAssemblyName(object c)
|
||||
{
|
||||
ClassLoaderWrapper loader = TypeWrapper.FromClass(c).GetClassLoader();
|
||||
TypeWrapper wrapper = TypeWrapper.FromClass(c);
|
||||
ClassLoaderWrapper loader = wrapper.GetClassLoader();
|
||||
IKVM.Internal.AssemblyClassLoader acl = loader as IKVM.Internal.AssemblyClassLoader;
|
||||
if(acl != null)
|
||||
{
|
||||
return acl.Assembly.FullName;
|
||||
return acl.GetAssembly(wrapper).FullName;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -244,7 +245,7 @@ namespace IKVM.NativeCode.ikvm.runtime
|
|||
Assembly[] assemblies = wrapper.FindResourceAssemblies(name, firstOnly);
|
||||
if(assemblies == null || assemblies.Length == 0)
|
||||
{
|
||||
Tracer.Info(Tracer.ClassLoading, "Failed to find resource \"{0}\" in {1}", name, wrapper.Assembly.FullName);
|
||||
Tracer.Info(Tracer.ClassLoading, "Failed to find resource \"{0}\" in {1}", name, assembly.FullName);
|
||||
return null;
|
||||
}
|
||||
foreach(Assembly asm in assemblies)
|
||||
|
@ -254,10 +255,11 @@ namespace IKVM.NativeCode.ikvm.runtime
|
|||
return assemblies;
|
||||
}
|
||||
|
||||
public static Assembly GetAssemblyFromClassLoader(object classLoader)
|
||||
public static Assembly GetAssemblyFromClass(object clazz)
|
||||
{
|
||||
AssemblyClassLoader_ acl = ClassLoaderWrapper.GetClassLoaderWrapper(classLoader) as AssemblyClassLoader_;
|
||||
return acl != null ? acl.Assembly : null;
|
||||
TypeWrapper wrapper = TypeWrapper.FromClass(clazz);
|
||||
AssemblyClassLoader_ acl = wrapper.GetClassLoader() as AssemblyClassLoader_;
|
||||
return acl != null ? acl.GetAssembly(wrapper) : null;
|
||||
}
|
||||
|
||||
// NOTE the array may contain duplicates!
|
||||
|
@ -294,11 +296,6 @@ namespace IKVM.NativeCode.ikvm.runtime
|
|||
#endif
|
||||
}
|
||||
|
||||
public static Assembly GetBootClassLoaderAssembly()
|
||||
{
|
||||
return ClassLoaderWrapper.GetBootstrapClassLoader().Assembly;
|
||||
}
|
||||
|
||||
public static string GetGenericClassLoaderName(object classLoader)
|
||||
{
|
||||
#if FIRST_PASS
|
||||
|
|
|
@ -473,7 +473,7 @@ namespace IKVM.NativeCode.java
|
|||
{
|
||||
ClassLoaderWrapper classLoader = tw.GetClassLoader();
|
||||
AssemblyClassLoader acl = classLoader as AssemblyClassLoader;
|
||||
if (acl == null || acl.Assembly != typeof(object).Assembly)
|
||||
if (acl == null || acl.GetAssembly(tw) != typeof(object).Assembly)
|
||||
{
|
||||
object javaClassLoader = classLoader.GetJavaClassLoader();
|
||||
if (javaClassLoader != null)
|
||||
|
|
Загрузка…
Ссылка в новой задаче