|
// <auto-generated/>
#nullable enable
using System;
using Microsoft.Diagnostics.DataContractReader.Contracts;
namespace Microsoft.Diagnostics.DataContractReader.Generated;
internal static class TypeNameResolver
{
public static TypeHandle GetTypeHandle(Target target, string[] names)
{
foreach (string name in names)
{
if (target.Contracts.ManagedTypeSource.TryGetTypeHandle(name, out TypeHandle th))
return th;
}
throw new InvalidOperationException(
$"No managed type resolved for TypeHandle (names=[{string.Join(",", names)}]).");
}
public static TargetPointer GetStaticFieldAddress(Target target, string[] names, string fieldName)
{
if (!TryGetStaticFieldAddress(target, names, fieldName, out TargetPointer address))
throw new InvalidOperationException(
$"No static field '{fieldName}' resolved (names=[{string.Join(",", names)}]).");
return address;
}
public static bool TryGetStaticFieldAddress(Target target, string[] names, string fieldName, out TargetPointer address)
{
// Native globals take precedence. Compose "TypeName.fieldName" for each candidate.
foreach (string name in names)
{
if (target.TryReadGlobalPointer(name + "." + fieldName, out TargetPointer? nativeAddr))
{
address = nativeAddr.Value;
return true;
}
}
if (target.Contracts.TryGetContract(out IManagedTypeSource mts))
{
foreach (string name in names)
{
if (mts.TryGetStaticFieldAddress(name, fieldName, out address))
return true;
}
}
address = default;
return false;
}
public static TargetPointer GetThreadStaticFieldAddress(Target target, string[] names, string fieldName, TargetPointer thread)
{
foreach (string name in names)
{
if (target.Contracts.ManagedTypeSource.TryGetThreadStaticFieldAddress(name, fieldName, thread, out TargetPointer address))
return address;
}
throw new InvalidOperationException(
$"No thread-static field '{fieldName}' resolved (names=[{string.Join(",", names)}]).");
}
} |