using System; using UnityEditor.MemoryProfiler; using System.Collections.Generic; using System.Linq; namespace MemoryProfilerWindow { static class TypeTools { public enum FieldFindOptions { OnlyInstance, OnlyStatic } static public IEnumerable AllFieldsOf (TypeDescription typeDescription, TypeDescription[] typeDescriptions, FieldFindOptions findOptions) { if (typeDescription.isArray) yield break; if (findOptions != FieldFindOptions.OnlyStatic && typeDescription.baseOrElementTypeIndex != -1 && !typeDescription.isValueType) { var baseTypeDescription = typeDescriptions [typeDescription.baseOrElementTypeIndex]; foreach(var field in AllFieldsOf(baseTypeDescription, typeDescriptions, findOptions)) yield return field; } foreach (var field in typeDescription.fields) { if (!FieldMatchesOptions(field, findOptions)) continue; if (field.typeIndex == typeDescription.typeIndex && typeDescription.isValueType) { // this happens in primitive types like System.Single, which is a weird type that has a field of its own type. continue; } if (field.offset == -1) { // this is how we encode TLS fields. We don't support TLS fields yet. continue; } yield return field; } } static bool FieldMatchesOptions(FieldDescription field, FieldFindOptions options) { if (field.isStatic && options == FieldFindOptions.OnlyStatic) return true; if (!field.isStatic && options == FieldFindOptions.OnlyInstance) return true; return false; } } }