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:
jfrijters 2009-02-04 07:24:44 +00:00
Родитель c84bf959b6
Коммит 5eebd6f17b
5 изменённых файлов: 19 добавлений и 22 удалений

Просмотреть файл

@ -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)