File: Contracts\ObjectiveCMarshal_1.cs
Web Access
Project: src\runtime\src\native\managed\cdac\Microsoft.Diagnostics.DataContractReader.Contracts\Microsoft.Diagnostics.DataContractReader.Contracts.csproj (Microsoft.Diagnostics.DataContractReader.Contracts)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.Diagnostics.DataContractReader.Data;

namespace Microsoft.Diagnostics.DataContractReader.Contracts;

internal readonly struct ObjectiveCMarshal_1 : IObjectiveCMarshal
{
    private readonly Target _target;

    internal ObjectiveCMarshal_1(Target target)
    {
        _target = target;
    }

    public TargetPointer GetTaggedMemory(TargetPointer address, out TargetNUInt size)
    {
        size = default;

        TargetPointer? objectsTable = Data.ObjectiveCMarshal.ObjectTrackingInfoTable(_target);
        if (objectsTable is null || objectsTable.Value == TargetPointer.Null)
            return TargetPointer.Null;

        IConditionalWeakTable cwt = _target.Contracts.ConditionalWeakTable;
        if (cwt.TryGetValue(objectsTable.Value, address, out TargetPointer trackingInfoAddress))
        {
            ObjcTrackingInformation trackingInfo = _target.ProcessedData.GetOrAdd<ObjcTrackingInformation>(trackingInfoAddress);
            if (trackingInfo.Memory != TargetPointer.Null)
            {
                const int TAGGED_MEMORY_SIZE_IN_POINTERS = 2;
                size = new TargetNUInt(TAGGED_MEMORY_SIZE_IN_POINTERS * (ulong)_target.PointerSize);
                return trackingInfo.Memory;
            }
        }

        return TargetPointer.Null;
    }
}