From 0a18471be3ed75b5d4893dfdee28418972bb52cb Mon Sep 17 00:00:00 2001 From: jfrijters Date: Mon, 2 Jan 2012 15:11:09 +0000 Subject: [PATCH] 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. --- runtime/ClassLoaderWrapper.cs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/runtime/ClassLoaderWrapper.cs b/runtime/ClassLoaderWrapper.cs index c8329e51..3ff7edfc 100644 --- a/runtime/ClassLoaderWrapper.cs +++ b/runtime/ClassLoaderWrapper.cs @@ -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);