Added a couple of checks to avoid problems when user code tries to convert .NET types that aren't supported into a Class.

This commit is contained in:
jfrijters 2010-05-10 04:47:34 +00:00
Родитель 183c9e66d8
Коммит c5641ac723
1 изменённых файлов: 30 добавлений и 0 удалений

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

@ -359,6 +359,10 @@ namespace IKVM.NativeCode.ikvm.runtime
{
return DotNetTypeWrapper.GetWrapperFromDotNetType(t).ClassObject;
}
if(!IsVisibleAsClass(t))
{
return null;
}
TypeWrapper tw = ClassLoaderWrapper.GetWrapperFromType(t);
if(tw != null)
{
@ -380,6 +384,10 @@ namespace IKVM.NativeCode.ikvm.runtime
{
type = type.DeclaringType;
}
if(!IsVisibleAsClass(type))
{
return null;
}
TypeWrapper wrapper = ClassLoaderWrapper.GetWrapperFromType(type);
if(wrapper == null)
{
@ -392,6 +400,28 @@ namespace IKVM.NativeCode.ikvm.runtime
return wrapper.ClassObject;
}
private static bool IsVisibleAsClass(Type type)
{
while (type.HasElementType)
{
if (type.IsPointer || type.IsByRef)
{
return false;
}
type = type.GetElementType();
}
if (type.ContainsGenericParameters && !type.IsGenericTypeDefinition)
{
return false;
}
System.Reflection.Emit.TypeBuilder tb = type as System.Reflection.Emit.TypeBuilder;
if (tb != null && !tb.IsCreated())
{
return false;
}
return true;
}
public static Type getInstanceTypeFromClass(object clazz)
{
TypeWrapper wrapper = TypeWrapper.FromClass(clazz);