From 84f82474eb6444e0dc748c2c03bf17ce7b733899 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Sun, 9 Aug 2020 21:32:43 +0200 Subject: [PATCH] Refactor Model.CustomAttributeGenerators to give list of unique VAs per TypeInfo --- Il2CppInspector.Common/Reflection/TypeModel.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Il2CppInspector.Common/Reflection/TypeModel.cs b/Il2CppInspector.Common/Reflection/TypeModel.cs index a6941fd..493bb6d 100644 --- a/Il2CppInspector.Common/Reflection/TypeModel.cs +++ b/Il2CppInspector.Common/Reflection/TypeModel.cs @@ -48,8 +48,8 @@ namespace Il2CppInspector.Reflection // List of all generated CustomAttributeData objects by their instanceIndex into AttributeTypeIndices public ConcurrentDictionary AttributesByIndices { get; } = new ConcurrentDictionary(); - // List of unique custom attributes generators (multiple indices above may refer to a single generator function) - public List CustomAttributeGenerators { get; } + // List of unique custom attributes generators indexed by type (multiple indices above may refer to a single generator function) + public Dictionary> CustomAttributeGenerators { get; } // Get an assembly by its image name public Assembly GetAssembly(string name) => Assemblies.FirstOrDefault(a => a.ShortName == name); @@ -132,8 +132,10 @@ namespace Il2CppInspector.Reflection var allMethodAttributes = MethodsByDefinitionIndex.Select(m => m.CustomAttributes).ToList(); var allParameterAttributes = MethodsByDefinitionIndex.SelectMany(m => m.DeclaredParameters).Select(p => p.CustomAttributes).ToList(); - // Populate list of unique custom attribute generators - CustomAttributeGenerators = AttributesByIndices.Values.GroupBy(a => a.VirtualAddress.Start).Select(a => a.First()).ToList(); + // Populate list of unique custom attribute generators for each type + CustomAttributeGenerators = AttributesByIndices.Values + .GroupBy(a => a.AttributeType) + .ToDictionary(g => g.Key, g => g.GroupBy(a => a.VirtualAddress.Start).Select(g => g.First()).ToList()); // Create method invokers (one per signature, in invoker index order) foreach (var method in MethodsByDefinitionIndex) {