in src/Microsoft.Diagnostics.Runtime/Implementation/ClrTypeFactory.cs [306:371]
public ClrType GetOrCreateBasicType(ClrElementType basicType)
{
ClrModule bcl = _heap.Runtime.BaseClassLibrary;
// We'll assume 'Class' is just System.Object
if (basicType == ClrElementType.Class)
basicType = ClrElementType.Object;
ClrType?[]? basicTypes = _basicTypes;
if (basicTypes is null)
{
basicTypes = new ClrType[(int)ClrElementType.SZArray];
int count = 0;
if (bcl.MetadataReader != null)
{
foreach ((ulong mt, int _) in bcl.EnumerateTypeDefToMethodTableMap())
{
string? name = _typeHelpers.GetTypeName(0, mt, 0);
ClrElementType type = name switch
{
"System.Void" => ClrElementType.Void,
"System.Boolean" => ClrElementType.Boolean,
"System.Char" => ClrElementType.Char,
"System.SByte" => ClrElementType.Int8,
"System.Byte" => ClrElementType.UInt8,
"System.Int16" => ClrElementType.Int16,
"System.UInt16" => ClrElementType.UInt16,
"System.Int32" => ClrElementType.Int32,
"System.UInt32" => ClrElementType.UInt32,
"System.Int64" => ClrElementType.Int64,
"System.UInt64" => ClrElementType.UInt64,
"System.Single" => ClrElementType.Float,
"System.Double" => ClrElementType.Double,
"System.IntPtr" => ClrElementType.NativeInt,
"System.UIntPtr" => ClrElementType.NativeUInt,
"System.ValueType" => ClrElementType.Struct,
_ => ClrElementType.Unknown,
};
if (type != ClrElementType.Unknown)
{
basicTypes[(int)type - 1] = GetOrCreateType(mt, 0);
count++;
if (count == 16)
break;
}
}
}
basicTypes[(int)ClrElementType.Object] = _heap.ObjectType;
basicTypes[(int)ClrElementType.String] = _heap.StringType;
Interlocked.CompareExchange(ref _basicTypes, basicTypes, null);
}
int index = (int)basicType - 1;
if (index < 0 || index > basicTypes.Length)
throw new ArgumentException($"Cannot create type for ClrElementType {basicType}");
ClrType? result = basicTypes[index];
if (result is not null)
return result;
return basicTypes[index] = new ClrPrimitiveType(_typeHelpers, bcl, _heap, basicType);
}