Cosmos/source/Cosmos.IL2CPU.Plugs/ObjectUtilities.cs
2016-12-13 22:39:41 -06:00

74 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Cosmos.IL2CPU.Plugs
{
public static class ObjectUtilities
{
/// <summary>
/// <para>
/// The object first stores any metadata involved. (Most likely containing a reference to the
/// object type). This is the number of bytes.
/// </para>
/// <para>
/// The first 4 bytes are the reference to the type information of the instance,
/// the second 4 bytes are the <see cref="InstanceTypeEnum"/> value.
/// For arrays, there are 4 following bytes containing the element count,
/// for objects, the amount of reference fields.
/// For arrays, next 4 bytes containing the element size.
/// </para>
/// </summary>
public const int FieldDataOffset = 12;
public enum InstanceTypeEnum : uint
{
NormalObject = 1,
Array = 2,
BoxedValueType = 3,
StaticEmbeddedObject = 0x80000001,
StaticEmbeddedArray = 0x80000002
}
public static bool IsDelegate(Type aType)
{
if (aType.FullName == "System.Object")
{
return false;
}
if (aType.GetTypeInfo().BaseType.FullName == "System.Delegate")
{
return true;
}
if (aType.GetTypeInfo().BaseType.FullName == "System.Object")
{
return false;
}
return IsDelegate(aType.GetTypeInfo().BaseType);
}
public static bool IsArray(Type aType)
{
if (aType.FullName == "System.Object")
{
return false;
}
if (aType.GetTypeInfo().BaseType.FullName == "System.Array")
{
return true;
}
if (aType.GetTypeInfo().BaseType.FullName == "System.Object")
{
return false;
}
return IsArray(aType.GetTypeInfo().BaseType);
}
}
}