void AddGCHandle(TreeViewItem parent, PackedGCHandle gcHandle) { var item = new GCHandleItem { id = m_UniqueId++, depth = parent.depth + 1 }; item.Initialize(this, m_Snapshot, gcHandle.gcHandlesArrayIndex); parent.AddChild(item); }
public TreeViewItem BuildTree(PackedMemorySnapshot snapshot) { m_Snapshot = snapshot; m_UniqueId = 1; var root = new TreeViewItem { id = 0, depth = -1, displayName = "Root" }; if (m_Snapshot == null) { root.AddChild(new TreeViewItem { id = 1, depth = -1, displayName = "" }); return(root); } // int=typeIndex var groupLookup = new Dictionary <int, GroupItem>(); for (int n = 0, nend = m_Snapshot.gcHandles.Length; n < nend; ++n) { var gcHandle = m_Snapshot.gcHandles[n]; var managedTypeIndex = -1; if (gcHandle.managedObjectsArrayIndex >= 0) { managedTypeIndex = m_Snapshot.managedObjects[gcHandle.managedObjectsArrayIndex].managedTypesArrayIndex; } var targetItem = root; if (managedTypeIndex >= 0) { GroupItem group; if (!groupLookup.TryGetValue(managedTypeIndex, out group)) { group = new GroupItem { id = m_UniqueId++, depth = 0, displayName = "" }; group.Initialize(m_Snapshot, managedTypeIndex); groupLookup[managedTypeIndex] = group; root.AddChild(group); } targetItem = group; } var item = new GCHandleItem { id = m_UniqueId++, depth = targetItem.depth + 1, displayName = "" }; item.Initialize(this, m_Snapshot, gcHandle.gcHandlesArrayIndex); targetItem.AddChild(item); } // remove groups if it contains one item only for (int n = root.children.Count - 1; n >= 0; --n) { var group = root.children[n]; if (group.hasChildren && group.children.Count == 1) { group.children[0].depth -= 1; root.AddChild(group.children[0]); root.children.RemoveAt(n); } } return(root); }