using System; using UnityEditor.MemoryProfiler; namespace MemoryProfilerWindow { static class ArrayTools { public static int ReadArrayLength(MemorySection[] heap, UInt64 address, TypeDescription arrayType, VirtualMachineInformation virtualMachineInformation) { var bo = heap.Find(address, virtualMachineInformation); var bounds = bo.Add(virtualMachineInformation.arrayBoundsOffsetInHeader).ReadPointer(); if (bounds == 0) return bo.Add(virtualMachineInformation.arraySizeOffsetInHeader).ReadInt32(); var cursor = heap.Find(bounds, virtualMachineInformation); int length = 1; for (int i = 0; i != arrayType.arrayRank; i++) { length *= cursor.ReadInt32(); cursor = cursor.Add(8); } return length; } public static int ReadArrayObjectSizeInBytes(MemorySection[] heap, UInt64 address, TypeDescription arrayType, TypeDescription[] typeDescriptions, VirtualMachineInformation virtualMachineInformation) { var arrayLength = ArrayTools.ReadArrayLength(heap, address, arrayType, virtualMachineInformation); var elementType = typeDescriptions[arrayType.baseOrElementTypeIndex]; var elementSize = elementType.isValueType ? elementType.size : virtualMachineInformation.pointerSize; return virtualMachineInformation.arrayHeaderSize + elementSize * arrayLength; } } }