Performance: Pre-arrange custom attribute indexes for versions >=24.1
This commit is contained in:
@@ -22,6 +22,9 @@ namespace Il2CppInspector
|
|||||||
// All method pointers sorted in ascending order (for finding the end of a method)
|
// All method pointers sorted in ascending order (for finding the end of a method)
|
||||||
private List<ulong> sortedMethodPointers { get; }
|
private List<ulong> sortedMethodPointers { get; }
|
||||||
|
|
||||||
|
// Attribute indexes (>=24.1) arranged by customAttributeStart and token
|
||||||
|
public Dictionary<int, Dictionary<uint, int>> AttributeIndicesByToken { get; }
|
||||||
|
|
||||||
// Shortcuts
|
// Shortcuts
|
||||||
public double Version => Metadata.Version;
|
public double Version => Metadata.Version;
|
||||||
|
|
||||||
@@ -158,6 +161,20 @@ namespace Il2CppInspector
|
|||||||
sortedMethodPointers = Binary.GlobalMethodPointers.OrderBy(m => m).ToList();
|
sortedMethodPointers = Binary.GlobalMethodPointers.OrderBy(m => m).ToList();
|
||||||
if (Version >= 24.2)
|
if (Version >= 24.2)
|
||||||
sortedMethodPointers = Binary.ModuleMethodPointers.SelectMany(module => module.Value).OrderBy(m => m).ToList();
|
sortedMethodPointers = Binary.ModuleMethodPointers.SelectMany(module => module.Value).OrderBy(m => m).ToList();
|
||||||
|
|
||||||
|
// Organize custom attribute indices
|
||||||
|
if (Version >= 24.1) {
|
||||||
|
AttributeIndicesByToken = new Dictionary<int, Dictionary<uint, int>>();
|
||||||
|
foreach (var image in Images) {
|
||||||
|
var attsByToken = new Dictionary<uint, int>();
|
||||||
|
for (int i = 0; i < image.customAttributeCount; i++) {
|
||||||
|
var index = image.customAttributeStart + i;
|
||||||
|
var token = AttributeTypeRanges[index].token;
|
||||||
|
attsByToken.Add(token, index);
|
||||||
|
}
|
||||||
|
AttributeIndicesByToken.Add(image.customAttributeStart, attsByToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public (ulong Start, ulong End)? GetMethodPointer(Il2CppCodeGenModule module, Il2CppMethodDefinition methodDef) {
|
public (ulong Start, ulong End)? GetMethodPointer(Il2CppCodeGenModule module, Il2CppMethodDefinition methodDef) {
|
||||||
|
|||||||
@@ -113,12 +113,10 @@ namespace Il2CppInspector.Reflection
|
|||||||
if (Package.Version <= 24.0)
|
if (Package.Version <= 24.0)
|
||||||
return customAttributeIndex;
|
return customAttributeIndex;
|
||||||
|
|
||||||
var image = asm.ImageDefinition;
|
|
||||||
var imageRange = image.customAttributeStart..(int)(image.customAttributeStart + image.customAttributeCount);
|
|
||||||
|
|
||||||
// From v24.1 onwards, token was added to Il2CppCustomAttributeTypeRange and each Il2CppImageDefinition noted the CustomAttributeTypeRanges for the image
|
// From v24.1 onwards, token was added to Il2CppCustomAttributeTypeRange and each Il2CppImageDefinition noted the CustomAttributeTypeRanges for the image
|
||||||
var index = Array.FindIndex(Package.AttributeTypeRanges[imageRange], x => x.token == token);
|
if (!Package.AttributeIndicesByToken[asm.ImageDefinition.customAttributeStart].TryGetValue(token, out var index))
|
||||||
return index == -1 ? -1 : index + image.customAttributeStart;
|
return -1;
|
||||||
|
return index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user