in ClrMemDiag/Desktop/fields.cs [463:594]
public DesktopInstanceField(DesktopGCHeap heap, IFieldData data, string name, FieldAttributes attributes, IntPtr sig, int sigLen)
{
_name = name;
_field = data;
_attributes = attributes;
ulong mt = data.TypeMethodTable;
if (mt != 0)
_type = (BaseDesktopHeapType)heap.GetTypeByMethodTable(mt, 0);
if (_type == null)
{
if (sig != IntPtr.Zero && sigLen > 0)
{
SigParser sigParser = new SigParser(sig, sigLen);
bool res;
int sigType, etype = 0;
if (res = sigParser.GetCallingConvInfo(out sigType))
Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD);
res = res && sigParser.SkipCustomModifiers();
res = res && sigParser.GetElemType(out etype);
// Generic instantiation
if (etype == 0x15)
res = res && sigParser.GetElemType(out etype);
if (res)
{
ClrElementType type = (ClrElementType)etype;
if (type == ClrElementType.Array)
{
res = sigParser.PeekElemType(out etype);
res = res && sigParser.SkipExactlyOne();
int ranks = 0;
res = res && sigParser.GetData(out ranks);
if (res)
_type = heap.GetArrayType((ClrElementType)etype, ranks, null);
}
else if (type == ClrElementType.SZArray)
{
res = sigParser.PeekElemType(out etype);
type = (ClrElementType)etype;
if (DesktopRuntimeBase.IsObjectReference(type))
_type = (BaseDesktopHeapType)heap.GetBasicType(ClrElementType.SZArray);
else
_type = (BaseDesktopHeapType)heap.GetArrayType(type, -1, null);
}
else if (type == ClrElementType.Pointer)
{
// Only deal with single pointers for now and types that have already been constructed
res = sigParser.GetElemType(out etype);
type = (ClrElementType)etype;
int token;
sigParser.GetToken(out token);
BaseDesktopHeapType innerType = (BaseDesktopHeapType)heap.GetTypeByToken(heap.DesktopRuntime.GetModule(data.Module), Convert.ToUInt32(token));
if (innerType == null)
{
innerType = (BaseDesktopHeapType)heap.GetBasicType(type);
}
_type = heap.CreatePointerType(innerType, type, null);
}
else
{
// If it's a class or struct, then try to get the token
int token = 0;
if (etype == 0x11 || etype == 0x12)
res = res && sigParser.GetToken(out token);
if (token != 0)
_type = (BaseDesktopHeapType)heap.GetTypeByToken(heap.DesktopRuntime.GetModule(data.Module), (uint)token);
if (_type == null)
if ((_type = (BaseDesktopHeapType)heap.GetBasicType((ClrElementType)etype)) == null)
_type = heap.DesktopErrorType;
}
}
}
if (_type == null)
_type = (BaseDesktopHeapType)heap.GetBasicType(ElementType);
}
else if (ElementType != ClrElementType.Class)
{
_type.ElementType = ElementType;
}
if (_type.IsArray && _type.ComponentType == null)
{
if (sig != IntPtr.Zero && sigLen > 0)
{
SigParser sigParser = new SigParser(sig, sigLen);
bool res;
int sigType, etype = 0;
if (res = sigParser.GetCallingConvInfo(out sigType))
Debug.Assert(sigType == SigParser.IMAGE_CEE_CS_CALLCONV_FIELD);
res = res && sigParser.SkipCustomModifiers();
res = res && sigParser.GetElemType(out etype);
res = res && sigParser.GetElemType(out etype);
// Generic instantiation
if (etype == 0x15)
res = res && sigParser.GetElemType(out etype);
// If it's a class or struct, then try to get the token
int token = 0;
if (etype == 0x11 || etype == 0x12)
res = res && sigParser.GetToken(out token);
if (token != 0)
_type.ComponentType = heap.GetTypeByToken(heap.DesktopRuntime.GetModule(data.Module), (uint)token);
else if (_type.ComponentType == null)
if ((_type.ComponentType = heap.GetBasicType((ClrElementType)etype)) == null)
_type.ComponentType = heap.DesktopErrorType;
}
}
}