sharplib/prof/MethodInfo.cs

69 lines
2.1 KiB
C#

using System;
namespace ProfilerHelpers
{
public class MethodInfo
{
private readonly ulong _startAddress;
private readonly int _size;
private readonly string _fullName;
internal MethodInfo( ulong startAddress, int size, string namespaceAndTypeName, string name, string signature )
{
_startAddress = startAddress;
_size = size;
_fullName = ComputeFullName( startAddress, namespaceAndTypeName, name, signature );
}
private string ComputeFullName( ulong startAddress, string namespaceAndTypeName, string name, string signature )
{
var fullName = signature;
// constructor case: name = .ctor | namespaceAndTypeName = A.B.typeName | signature = ... (parameters)
// --> A.B.typeName(parameters)
if( name == ".ctor" )
{
return $"{namespaceAndTypeName}{ExtractParameters( signature )}";
}
// general case: name = Foo | namespaceAndTypeName = A.B.typeName | signature = ... (parameters)
// --> A.B.Foo(parameters)
fullName = $"{namespaceAndTypeName}.{name}{ExtractParameters( signature )}";
return fullName;
}
private string ExtractTypeName( string namespaceAndTypeName )
{
var pos = namespaceAndTypeName.LastIndexOf( ".", StringComparison.Ordinal );
if( pos == -1 )
{
return namespaceAndTypeName;
}
// skip the .
pos++;
return namespaceAndTypeName.Substring( pos );
}
private string ExtractParameters( string signature )
{
var pos = signature.IndexOf( " (" );
if( pos == -1 )
{
return "(???)";
}
// skip double space
pos += 2;
var parameters = signature.Substring( pos );
return parameters;
}
public ulong StartAddress => _startAddress;
public int Size => _size;
public string FullName => _fullName;
}
}