// 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());
                }
            }
            }
        }
Esempio n. 2
0
        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();
        }