in src/Microsoft.Diagnostics.Runtime/src/Implementation/ClrmdField.cs [209:269]
internal static int GetSize(ClrType? type, ClrElementType cet)
{
// todo: What if we have a struct which is not fully constructed (null MT,
// null type) and need to get the size of the field?
switch (cet)
{
case ClrElementType.Struct:
if (type is null)
return 1;
ClrField? last = null;
ImmutableArray<ClrInstanceField> fields = type.Fields;
foreach (ClrField field in fields)
{
if (last is null)
last = field;
else if (field.Offset > last.Offset)
last = field;
else if (field.Offset == last.Offset && field.Size > last.Size)
last = field;
}
if (last is null)
return 0;
return last.Offset + last.Size;
case ClrElementType.Int8:
case ClrElementType.UInt8:
case ClrElementType.Boolean:
return 1;
case ClrElementType.Float:
case ClrElementType.Int32:
case ClrElementType.UInt32:
return 4;
case ClrElementType.Double: // double
case ClrElementType.Int64:
case ClrElementType.UInt64:
return 8;
case ClrElementType.String:
case ClrElementType.Class:
case ClrElementType.Array:
case ClrElementType.SZArray:
case ClrElementType.Object:
case ClrElementType.NativeInt: // native int
case ClrElementType.NativeUInt: // native unsigned int
case ClrElementType.Pointer:
case ClrElementType.FunctionPointer:
return IntPtr.Size;
case ClrElementType.UInt16:
case ClrElementType.Int16:
case ClrElementType.Char: // u2
return 2;
}
throw new Exception("Unexpected element type.");
}