Bug fix. When constructing a generic class loader we can't use GetWrapperFromType() on the type arguments, because they might refer to a subtype that is currently being loaded.

This commit is contained in:
jfrijters 2012-01-02 15:11:09 +00:00
Родитель 003c8edc50
Коммит 0a18471be3
1 изменённых файлов: 34 добавлений и 1 удалений

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

@ -1019,6 +1019,39 @@ namespace IKVM.Internal
return wrapper;
}
private static ClassLoaderWrapper GetLoaderFromType(Type type)
{
Debug.Assert(!ReflectUtil.IsReflectionOnly(type));
if(remappedTypes.ContainsKey(type))
{
return bootstrapClassLoader;
}
else if(ReflectUtil.IsVector(type))
{
// it might be an array of a dynamically compiled Java type
int rank = 1;
Type elem = type.GetElementType();
while(ReflectUtil.IsVector(elem))
{
rank++;
elem = elem.GetElementType();
}
return GetLoaderFromType(elem);
}
else
{
Assembly asm = type.Assembly;
#if CLASSGC
ClassLoaderWrapper loader;
if(dynamicAssemblies != null && dynamicAssemblies.TryGetValue(asm, out loader))
{
return loader;
}
#endif
return AssemblyClassLoader.FromAssembly(asm);
}
}
internal virtual Type GetGenericTypeDefinition(string name)
{
return null;
@ -1034,7 +1067,7 @@ namespace IKVM.Internal
list.Add(AssemblyClassLoader.FromAssembly(type.Assembly));
foreach(Type arg in type.GetGenericArguments())
{
ClassLoaderWrapper loader = GetWrapperFromType(arg).GetClassLoader();
ClassLoaderWrapper loader = GetLoaderFromType(arg);
if(!list.Contains(loader) && loader != bootstrapClassLoader)
{
list.Add(loader);