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); }
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); }
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); } }
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); }
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); }