in src/Microsoft.Diagnostics.Runtime/GCDesc.cs [22:75]
public IEnumerable<(ulong ReferencedObject, int Offset)> WalkObject(byte[] buffer, int size)
{
DebugOnly.Assert(size >= IntPtr.Size);
int series = GetNumSeries();
int highest = GetHighestSeries();
int curr = highest;
if (series > 0)
{
int lowest = GetLowestSeries();
do
{
long offset = GetSeriesOffset(curr);
long stop = offset + GetSeriesSize(curr) + size;
while (offset < stop)
{
ulong ret = new Span<byte>(buffer).AsPointer((int)offset);
if (ret != 0)
yield return (ret, (int)offset);
offset += IntPtr.Size;
}
curr -= s_GCDescSize;
} while (curr >= lowest);
}
else
{
long offset = GetSeriesOffset(curr);
while (offset < size - IntPtr.Size)
{
for (int i = 0; i > series; i--)
{
int nptrs = GetPointers(curr, i);
int skip = GetSkip(curr, i);
long stop = offset + (nptrs * IntPtr.Size);
do
{
ulong ret = new Span<byte>(buffer).AsPointer((int)offset);
if (ret != 0)
yield return (ret, (int)offset);
offset += IntPtr.Size;
} while (offset < stop);
offset += skip;
}
}
}
}