// Formats a string that *should* uniquely identify an object through multiple snapshots and multiple sessions public string FormatUniqueString(ObjectData od) { switch (od.dataType) { case ObjectDataType.Type: return(m_Snapshot.typeDescriptions.typeDescriptionName[od.managedTypeIndex]); case ObjectDataType.Global: return("<global>"); case ObjectDataType.NativeObject: return(FormatInstanceId(od.codeType, m_Snapshot.nativeObjects.instanceId[od.nativeObjectIndex])); case ObjectDataType.Object: { int index = od.GetManagedObjectIndex(m_Snapshot); if (index >= 0) { int nativeIndex = m_Snapshot.CrawledData.ManagedObjects[index].NativeObjectIndex; if (nativeIndex >= 0) { return(FormatInstanceId(CodeType.Managed, m_Snapshot.nativeObjects.instanceId[nativeIndex])); } ulong ptr; if (od.TryGetObjectPointer(out ptr)) { return(FormatPointer(ptr)); } } goto default; } case ObjectDataType.Unknown: return("<uninitialized type>"); default: { if (od.IsField()) { int offset = m_Snapshot.fieldDescriptions.offset[od.fieldIndex]; ulong objPtr = od.GetObjectPointer(m_Snapshot); return(FormatPointerAndOffset(objPtr, offset)); } else if (od.IsArrayItem()) { ulong objPtr = od.GetObjectPointer(m_Snapshot); return(FormatterPointerAndIndex(objPtr, od.arrayIndex)); } else { ulong ptr; if (od.TryGetObjectPointer(out ptr)) { return(FormatPointer(ptr)); } return(od.GetUnifiedObjectIndex(m_Snapshot).ToString()); } } } }
public ObjectReferenceTable(Database.Schema schema, SnapshotObjectDataFormatter formatter, CachedSnapshot snapshot, ManagedData crawledData, ObjectData obj, ObjectMetaType metaType) : base(schema, formatter, snapshot, crawledData, metaType) { m_Object = obj; m_References = ObjectConnection.GetAllObjectConnectingTo(snapshot, obj); #if DEBUG_VALIDATION int toUnifiedIndex = m_Object.GetUnifiedObjectIndex(snapshot); var toManagedIndex = snapshot.UnifiedObjectIndexToManagedObjectIndex(toUnifiedIndex); for (int k = 0; k != m_References.Length; ++k) { var oFrom = m_References[k]; switch (oFrom.dataType) { case ObjectDataType.ReferenceArray: case ObjectDataType.ReferenceObject: case ObjectDataType.Value: if (oFrom.m_Parent != null) { oFrom = oFrom.m_Parent.obj; } break; } bool connectionFound = false; switch (oFrom.dataType) { case ObjectDataType.Global: { if (snapshot.HasGlobalConnection(toManagedIndex)) { connectionFound = true; } } break; case ObjectDataType.Type: { if (snapshot.HasManagedTypeConnection(oFrom.managedTypeIndex, toManagedIndex)) { connectionFound = true; } } break; case ObjectDataType.Array: case ObjectDataType.BoxedValue: case ObjectDataType.Object: { if (snapshot.HasObjectConnection(oFrom.GetUnifiedObjectIndex(snapshot), toUnifiedIndex)) { connectionFound = true; break; } } break; case ObjectDataType.NativeObject: { if (snapshot.HasObjectConnection(oFrom.GetUnifiedObjectIndex(snapshot), toUnifiedIndex)) { connectionFound = true; break; } } break; } if (!connectionFound) { UnityEngine.Debug.LogError("Connection not found, index =" + k); } } #endif InitObjectList(); }