File: _generated\1\TypeNameResolver.g.cs
Web Access
Project: src\runtime\src\native\managed\cdac\Microsoft.Diagnostics.DataContractReader.Contracts\Microsoft.Diagnostics.DataContractReader.Contracts.csproj (Microsoft.Diagnostics.DataContractReader.Contracts)
// <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)}]).");
    }
}