in src/Microsoft.Diagnostics.Runtime/src/Utilities/SigParser/SigParser.cs [386:489]
public bool SkipExactlyOne()
{
if (!GetElemType(out int typ))
return false;
if (!((ClrElementType)typ).IsPrimitive())
{
switch (typ)
{
default:
return false;
case ELEMENT_TYPE_VAR:
case ELEMENT_TYPE_MVAR:
if (!GetData(out _))
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 _))
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)
{
if (!GetData(out int sizes))
return false;
while (sizes-- != 0)
if (!GetData(out _))
return false;
if (!GetData(out int bounds))
return false;
while (bounds-- != 0)
if (!GetData(out _))
return false;
}
break;
case ELEMENT_TYPE_SENTINEL:
// Should be unreachable since GetElem strips it
break;
case ELEMENT_TYPE_INTERNAL:
if (!GetData(out _))
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;
}