public static                            PackedManagedType[] FromMemoryProfiler(UnityEditor.MemoryProfiler.TypeDescription[] source)
        {
            var value = new PackedManagedType[source.Length];

            for (int n = 0, nend = source.Length; n < nend; ++n)
            {
                value[n] = new PackedManagedType
                {
                    isValueType            = source[n].isValueType,
                    isArray                = source[n].isArray,
                    arrayRank              = source[n].arrayRank,
                    name                   = source[n].name,
                    assembly               = source[n].assembly,
                    fields                 = PackedManagedField.FromMemoryProfiler(source[n].fields),
                    staticFieldBytes       = source[n].staticFieldBytes,
                    baseOrElementTypeIndex = source[n].baseOrElementTypeIndex,
                    size                   = source[n].size,
                    typeInfoAddress        = source[n].typeInfoAddress,
                    managedTypesArrayIndex = source[n].typeIndex,

                    nativeTypeArrayIndex = -1,
                };

                // namespace-less types have a preceding dot, which we remove here
                if (value[n].name != null && value[n].name.Length > 0 && value[n].name[0] == '.')
                {
                    value[n].name = value[n].name.Substring(1);
                }
            }
            return(value);
        }
        public bool TryGetField(string name, out PackedManagedField field)
        {
            for (int n = 0, nend = fields.Length; n < nend; ++n)
            {
                if (fields[n].name == name)
                {
                    field = fields[n];
                    return(true);
                }
            }

            field = new PackedManagedField();
            field.managedTypesArrayIndex = -1;
            return(false);
        }
Esempio n. 3
0
        public static               PackedManagedField[] FromMemoryProfiler(UnityEditor.MemoryProfiler.FieldDescription[] source)
        {
            var value = new PackedManagedField[source.Length];

            for (int n = 0, nend = source.Length; n < nend; ++n)
            {
                value[n] = new PackedManagedField
                {
                    name   = source[n].name,
                    offset = source[n].offset,
                    managedTypesArrayIndex = source[n].typeIndex,
                    isStatic = source[n].isStatic
                };
            }
            ;
            return(value);
        }
Esempio n. 4
0
        public static void Read(System.IO.BinaryReader reader, out PackedManagedField[] value)
        {
            value = new PackedManagedField[0];

            var version = reader.ReadInt32();

            if (version >= 1)
            {
                var length = reader.ReadInt32();
                value = new PackedManagedField[length];

                for (int n = 0, nend = value.Length; n < nend; ++n)
                {
                    value[n].name   = reader.ReadString();
                    value[n].offset = reader.ReadInt32();
                    value[n].managedTypesArrayIndex = reader.ReadInt32();
                    value[n].isStatic = reader.ReadBoolean();
                }
            }
        }
        void InitializeCachedPtr()
        {
            var unityEngineObject = m_Snapshot.managedTypes[m_Snapshot.coreTypes.unityEngineObject];

            // UnityEngine.Object types on the managed side have a m_CachedPtr field that
            // holds the native memory address of the corresponding native object of this managed object.
            m_CachedPtr = new PackedManagedField();

            for (int n = 0, nend = unityEngineObject.fields.Length; n < nend; ++n)
            {
                var field = unityEngineObject.fields[n];
                if (field.name != "m_CachedPtr")
                {
                    continue;
                }

                m_CachedPtr = field;
                return;
            }
        }
        public static void Read(System.IO.BinaryReader reader, out PackedManagedType[] value, out string stateString)
        {
            value       = new PackedManagedType[0];
            stateString = "";

            var version = reader.ReadInt32();

            if (version >= 1)
            {
                var length = reader.ReadInt32();
                stateString = string.Format("Loading {0} Managed Types", length);
                value       = new PackedManagedType[length];

                for (int n = 0, nend = value.Length; n < nend; ++n)
                {
                    value[n].isValueType = reader.ReadBoolean();
                    value[n].isArray     = reader.ReadBoolean();
                    value[n].arrayRank   = reader.ReadInt32();
                    value[n].name        = reader.ReadString();
                    value[n].assembly    = reader.ReadString();

                    var count = reader.ReadInt32();
                    value[n].staticFieldBytes       = reader.ReadBytes(count);
                    value[n].baseOrElementTypeIndex = reader.ReadInt32();
                    value[n].size                   = reader.ReadInt32();
                    value[n].typeInfoAddress        = reader.ReadUInt64();
                    value[n].managedTypesArrayIndex = reader.ReadInt32();

                    PackedManagedField.Read(reader, out value[n].fields);

                    // Types without namespace have a preceding period, which we remove here
                    // https://issuetracker.unity3d.com/issues/packedmemorysnapshot-leading-period-symbol-in-typename
                    if (value[n].name != null && value[n].name.Length > 0 && value[n].name[0] == '.')
                    {
                        value[n].name = value[n].name.Substring(1);
                    }

                    value[n].nativeTypeArrayIndex = -1;
                }
            }
        }
        public static void Write(System.IO.BinaryWriter writer, PackedManagedType[] value)
        {
            writer.Write(k_Version);
            writer.Write(value.Length);

            for (int n = 0, nend = value.Length; n < nend; ++n)
            {
                writer.Write(value[n].isValueType);
                writer.Write(value[n].isArray);
                writer.Write(value[n].arrayRank);
                writer.Write(value[n].name);
                writer.Write(value[n].assembly);

                writer.Write((System.Int32)value[n].staticFieldBytes.Length);
                writer.Write(value[n].staticFieldBytes);
                writer.Write(value[n].baseOrElementTypeIndex);
                writer.Write(value[n].size);
                writer.Write(value[n].typeInfoAddress);
                writer.Write(value[n].managedTypesArrayIndex);

                PackedManagedField.Write(writer, value[n].fields);
            }
        }
Esempio n. 8
0
        public bool FindField(string name, out PackedManagedField packedManagedField)
        {
            packedManagedField = new PackedManagedField();
            if (!isValid)
            {
                return(false);
            }

            var guard = 0;
            var me    = m_Snapshot.managedTypes[m_ManagedTypesArrayIndex];

            while (me.managedTypesArrayIndex != -1)
            {
                for (var n = 0; n < me.fields.Length; ++n)
                {
                    if (me.fields[n].name == name)
                    {
                        packedManagedField = me.fields[n];
                        return(true);
                    }
                }

                if (++guard > 64)
                {
                    break;
                }

                if (me.baseOrElementTypeIndex == -1)
                {
                    break;
                }

                me = m_Snapshot.managedTypes[me.baseOrElementTypeIndex];
            }
            return(false);
        }
Esempio n. 9
0
        public static                            PackedManagedType[] FromMemoryProfiler(UnityEditor.Profiling.Memory.Experimental.PackedMemorySnapshot snapshot)
        {
            var source = snapshot.typeDescriptions;
            var value  = new PackedManagedType[source.GetNumEntries()];

            var sourceAssembly = new string[source.assembly.GetNumEntries()];

            source.assembly.GetEntries(0, source.assembly.GetNumEntries(), ref sourceAssembly);

            var sourceFlags = new TypeFlags[source.flags.GetNumEntries()];

            source.flags.GetEntries(0, source.flags.GetNumEntries(), ref sourceFlags);

            var sourceName = new string[source.typeDescriptionName.GetNumEntries()];

            source.typeDescriptionName.GetEntries(0, source.typeDescriptionName.GetNumEntries(), ref sourceName);

            var sourceSize = new int[source.size.GetNumEntries()];

            source.size.GetEntries(0, source.size.GetNumEntries(), ref sourceSize);

            var sourceTypeInfoAddress = new ulong[source.typeInfoAddress.GetNumEntries()];

            source.typeInfoAddress.GetEntries(0, source.typeInfoAddress.GetNumEntries(), ref sourceTypeInfoAddress);

            var sourceTypeIndex = new int[source.typeIndex.GetNumEntries()];

            source.typeIndex.GetEntries(0, source.typeIndex.GetNumEntries(), ref sourceTypeIndex);

            var sourceBaseOrElementTypeIndex = new int[source.baseOrElementTypeIndex.GetNumEntries()];

            source.baseOrElementTypeIndex.GetEntries(0, source.baseOrElementTypeIndex.GetNumEntries(), ref sourceBaseOrElementTypeIndex);

            var sourceStaticFieldBytes = new byte[source.staticFieldBytes.GetNumEntries()][];

            source.staticFieldBytes.GetEntries(0, source.staticFieldBytes.GetNumEntries(), ref sourceStaticFieldBytes);

            var sourceFieldIndices = new int[source.fieldIndices.GetNumEntries()][];

            source.fieldIndices.GetEntries(0, source.fieldIndices.GetNumEntries(), ref sourceFieldIndices);

            // fields
            var desc = snapshot.fieldDescriptions;

            var fieldName = new string[desc.fieldDescriptionName.GetNumEntries()];

            desc.fieldDescriptionName.GetEntries(0, desc.fieldDescriptionName.GetNumEntries(), ref fieldName);

            var fieldStatic = new bool[desc.isStatic.GetNumEntries()];

            desc.isStatic.GetEntries(0, desc.isStatic.GetNumEntries(), ref fieldStatic);

            var fieldOffset = new int[desc.offset.GetNumEntries()];

            desc.offset.GetEntries(0, desc.offset.GetNumEntries(), ref fieldOffset);

            var fieldTypeIndex = new int[desc.typeIndex.GetNumEntries()];

            desc.typeIndex.GetEntries(0, desc.typeIndex.GetNumEntries(), ref fieldTypeIndex);

            var sourceFieldDescriptions = new PackedManagedField[desc.GetNumEntries()];

            for (int n = 0, nend = sourceFieldDescriptions.Length; n < nend; ++n)
            {
                sourceFieldDescriptions[n].name     = fieldName[n];
                sourceFieldDescriptions[n].isStatic = fieldStatic[n];
                sourceFieldDescriptions[n].offset   = fieldOffset[n];
                sourceFieldDescriptions[n].managedTypesArrayIndex = fieldTypeIndex[n];
            }

            for (int n = 0, nend = value.Length; n < nend; ++n)
            {
                value[n] = new PackedManagedType
                {
                    isValueType            = (sourceFlags[n] & TypeFlags.kValueType) != 0,
                    isArray                = (sourceFlags[n] & TypeFlags.kArray) != 0,
                    arrayRank              = (int)(sourceFlags[n] & TypeFlags.kArrayRankMask) >> 16,
                    name                   = sourceName[n],
                    assembly               = sourceAssembly[n],
                    staticFieldBytes       = sourceStaticFieldBytes[n],
                    baseOrElementTypeIndex = sourceBaseOrElementTypeIndex[n],
                    size                   = sourceSize[n],
                    typeInfoAddress        = sourceTypeInfoAddress[n],
                    managedTypesArrayIndex = sourceTypeIndex[n],

                    nativeTypeArrayIndex = -1,
                };

                value[n].fields = new PackedManagedField[sourceFieldIndices[n].Length];
                for (var j = 0; j < sourceFieldIndices[n].Length; ++j)
                {
                    var i = sourceFieldIndices[n][j];
                    value[n].fields[j].name     = sourceFieldDescriptions[i].name;
                    value[n].fields[j].offset   = sourceFieldDescriptions[i].offset;
                    value[n].fields[j].isStatic = sourceFieldDescriptions[i].isStatic;
                    value[n].fields[j].managedTypesArrayIndex = sourceFieldDescriptions[i].managedTypesArrayIndex;
                }

                // namespace-less types have a preceding dot, which we remove here
                if (value[n].name != null && value[n].name.Length > 0 && value[n].name[0] == '.')
                {
                    value[n].name = value[n].name.Substring(1);
                }
            }
            return(value);
        }