in ClrMemDiag/Utilities/sigparser.cs [394:494]
public bool SkipExactlyOne()
{
int typ;
if (!GetElemType(out typ))
return false;
int tmp;
if (!Microsoft.Diagnostics.Runtime.Desktop.DesktopRuntimeBase.IsPrimitive((ClrElementType)typ))
{
switch (typ)
{
default:
return false;
case ELEMENT_TYPE_VAR:
case ELEMENT_TYPE_MVAR:
if (!GetData(out tmp))
return false;
break;
case ELEMENT_TYPE_OBJECT:
case ELEMENT_TYPE_STRING:
case ELEMENT_TYPE_TYPEDBYREF:
break;
case ELEMENT_TYPE_BYREF:
case ELEMENT_TYPE_PTR:
case ELEMENT_TYPE_PINNED:
case ELEMENT_TYPE_SZARRAY:
if (!SkipExactlyOne())
return false;
break;
case ELEMENT_TYPE_VALUETYPE:
case ELEMENT_TYPE_CLASS:
if (!GetToken(out tmp))
return false;
break;
case ELEMENT_TYPE_FNPTR:
if (!SkipSignature())
return false;
break;
case ELEMENT_TYPE_ARRAY:
// Skip element type
if (!SkipExactlyOne())
return false;
// Get rank;
int rank;
if (!GetData(out rank))
return false;
if (rank > 0)
{
int sizes;
if (!GetData(out sizes))
return false;
while (sizes-- != 0)
if (!GetData(out tmp))
return false;
int bounds;
if (!GetData(out bounds))
return false;
while (bounds-- != 0)
if (!GetData(out tmp))
return false;
}
break;
case ELEMENT_TYPE_SENTINEL:
// Should be unreachable since GetElem strips it
break;
case ELEMENT_TYPE_INTERNAL:
if (!GetData(out tmp))
return false;
break;
case ELEMENT_TYPE_GENERICINST:
// Skip generic type
if (!SkipExactlyOne())
return false;
// Get number of parameters
int argCnt;
if (!GetData(out argCnt))
return false;
// Skip the parameters
while (argCnt-- != 0)
SkipExactlyOne();
break;
}
}
return true;
}