in ClrMemDiag/Desktop/heap.cs [689:767]
internal ClrElementType GetElementType(BaseDesktopHeapType type, int depth)
{
// Max recursion.
if (depth >= 32)
return ClrElementType.Object;
if (type == ObjectType)
return ClrElementType.Object;
else if (type == StringType)
return ClrElementType.String;
else if (type.ElementSize > 0)
return ClrElementType.SZArray;
BaseDesktopHeapType baseType = (BaseDesktopHeapType)type.BaseType;
if (baseType == null || baseType == ObjectType)
return ClrElementType.Object;
bool vc = false;
if (ValueType == null)
{
if (baseType.Name == "System.ValueType")
{
ValueType = baseType;
vc = true;
}
}
else if (baseType == ValueType)
{
vc = true;
}
if (!vc)
{
ClrElementType et = baseType.ElementType;
if (et == ClrElementType.Unknown)
{
et = GetElementType(baseType, depth + 1);
baseType.ElementType = et;
}
return et;
}
switch (type.Name)
{
case "System.Int32":
return ClrElementType.Int32;
case "System.Int16":
return ClrElementType.Int16;
case "System.Int64":
return ClrElementType.Int64;
case "System.IntPtr":
return ClrElementType.NativeInt;
case "System.UInt16":
return ClrElementType.UInt16;
case "System.UInt32":
return ClrElementType.UInt32;
case "System.UInt64":
return ClrElementType.UInt64;
case "System.UIntPtr":
return ClrElementType.NativeUInt;
case "System.Boolean":
return ClrElementType.Boolean;
case "System.Single":
return ClrElementType.Float;
case "System.Double":
return ClrElementType.Double;
case "System.Byte":
return ClrElementType.UInt8;
case "System.Char":
return ClrElementType.Char;
case "System.SByte":
return ClrElementType.Int8;
case "System.Enum":
return ClrElementType.Int32;
}
return ClrElementType.Struct;
}