in src/Microsoft.Diagnostics.Runtime/DacImplementation/DacTypeHelpers.cs [194:230]
public IEnumerable<FieldInfo> EnumerateFields(TypeInfo type, int baseFieldCount)
{
if (!_sos.GetFieldInfo(type.MethodTable, out MethodTableFieldInfo fieldInfo) || fieldInfo.FirstFieldAddress == 0)
yield break;
ulong nextField = fieldInfo.FirstFieldAddress;
for (int i = baseFieldCount; i < fieldInfo.NumInstanceFields + fieldInfo.NumStaticFields; i++)
{
if (!_sos.GetFieldData(nextField, out FieldData dacFieldData))
break;
if (dacFieldData.IsContextLocal == 0)
{
FieldKind kind;
if (dacFieldData.IsThreadLocal != 0)
kind = FieldKind.ThreadStatic;
else if (dacFieldData.IsStatic != 0)
kind = FieldKind.Static;
else if (dacFieldData.IsContextLocal != 0)
kind = FieldKind.Unsupported;
else
kind = FieldKind.Instance;
yield return new()
{
FieldDesc = nextField,
MethodTable = dacFieldData.TypeMethodTable,
ElementType = (ClrElementType)dacFieldData.ElementType,
Offset = dacFieldData.Offset <= int.MaxValue ? (int)dacFieldData.Offset : int.MaxValue,
Token = dacFieldData.FieldToken <= int.MaxValue ? (int)dacFieldData.FieldToken : int.MaxValue,
Kind = kind,
};
}
nextField = dacFieldData.NextField;
}
}