зеркало из https://github.com/mono/ikvm-fork.git
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:
Родитель
183c9e66d8
Коммит
c5641ac723
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче