Move index decoding to MetadataUsage

This reduces code duplication between metadata usage index decoding and
vtable method index decoding.
This commit is contained in:
Robert Xiao
2020-06-16 20:02:44 -07:00
committed by Katy
parent d426dad820
commit 5d57b76735
2 changed files with 24 additions and 26 deletions

View File

@@ -134,14 +134,7 @@ namespace Il2CppInspector
for (var i = 0; i < metadataUsageList.count; i++) for (var i = 0; i < metadataUsageList.count; i++)
{ {
var metadataUsagePair = Metadata.MetadataUsagePairs[metadataUsageList.start + i]; var metadataUsagePair = Metadata.MetadataUsagePairs[metadataUsageList.start + i];
usages.TryAdd(metadataUsagePair.destinationindex, MetadataUsage.FromEncodedIndex(this, metadataUsagePair.encodedSourceIndex));
var encodedType = metadataUsagePair.encodedSourceIndex & 0xE0000000;
var usageType = (MetadataUsageType)(encodedType >> 29);
var sourceIndex = metadataUsagePair.encodedSourceIndex & 0x1FFFFFFF;
var destinationIndex = metadataUsagePair.destinationindex;
usages.TryAdd(destinationIndex, new MetadataUsage(usageType, (int)sourceIndex, (int)destinationIndex));
} }
} }
@@ -149,8 +142,8 @@ namespace Il2CppInspector
// Unfortunately the value supplied in MetadataRegistration.matadataUsagesCount seems to be incorrect, // Unfortunately the value supplied in MetadataRegistration.matadataUsagesCount seems to be incorrect,
// so we have to calculate the correct number of usages above before reading the usage address list from the binary // so we have to calculate the correct number of usages above before reading the usage address list from the binary
var addresses = Binary.Image.ReadMappedArray<ulong>(Binary.MetadataRegistration.metadataUsages, usages.Count); var addresses = Binary.Image.ReadMappedArray<ulong>(Binary.MetadataRegistration.metadataUsages, usages.Count);
foreach (var usage in usages.Values) foreach (var usage in usages)
usage.SetAddress(addresses[usage.DestinationIndex]); usage.Value.SetAddress(addresses[usage.Key]);
return usages.Values.ToList(); return usages.Values.ToList();
} }
@@ -298,19 +291,9 @@ namespace Il2CppInspector
MetadataUsage[] res = new MetadataUsage[definition.vtable_count]; MetadataUsage[] res = new MetadataUsage[definition.vtable_count];
for (int i = 0; i < definition.vtable_count; i++) { for (int i = 0; i < definition.vtable_count; i++) {
var encodedIndex = VTableMethodIndices[definition.vtableStart + i]; var encodedIndex = VTableMethodIndices[definition.vtableStart + i];
uint index; MetadataUsage usage = MetadataUsage.FromEncodedIndex(this, encodedIndex);
MetadataUsageType usageType; if (usage.SourceIndex != 0)
if (Version < 19) { res[i] = usage;
var flag = encodedIndex & 0x80000000;
index = Binary.VTableMethodReferences[encodedIndex & 0x7FFFFFFF];
usageType = (flag != 0) ? MetadataUsageType.MethodRef : MetadataUsageType.MethodDef;
} else {
var encodedType = encodedIndex & 0xE0000000;
usageType = (MetadataUsageType)(encodedType >> 29);
index = encodedIndex & 0x1FFFFFFF;
}
if (index != 0)
res[i] = new MetadataUsage(usageType, (int)index, i);
} }
return res; return res;
} }

View File

@@ -21,13 +21,28 @@ namespace Il2CppInspector
{ {
public MetadataUsageType Type { get; } public MetadataUsageType Type { get; }
public int SourceIndex { get; } public int SourceIndex { get; }
public int DestinationIndex { get; }
public ulong VirtualAddress { get; private set; } public ulong VirtualAddress { get; private set; }
public MetadataUsage(MetadataUsageType type, int sourceIndex, int destinationIndex) { public MetadataUsage(MetadataUsageType type, int sourceIndex) {
Type = type; Type = type;
SourceIndex = sourceIndex; SourceIndex = sourceIndex;
DestinationIndex = destinationIndex; }
public static MetadataUsage FromEncodedIndex(Il2CppInspector package, uint encodedIndex) {
uint index;
MetadataUsageType usageType;
if (package.Version < 19) {
/* These encoded indices appear only in vtables, and are decoded by IsGenericMethodIndex/GetDecodedMethodIndex */
var isGeneric = encodedIndex & 0x80000000;
index = package.Binary.VTableMethodReferences[encodedIndex & 0x7FFFFFFF];
usageType = (isGeneric != 0) ? MetadataUsageType.MethodRef : MetadataUsageType.MethodDef;
} else {
/* These encoded indices appear in metadata usages, and are decoded by GetEncodedIndexType/GetDecodedMethodIndex */
var encodedType = encodedIndex & 0xE0000000;
usageType = (MetadataUsageType)(encodedType >> 29);
index = encodedIndex & 0x1FFFFFFF;
}
return new MetadataUsage(usageType, (int)index);
} }
public void SetAddress(ulong virtualAddress) => VirtualAddress = virtualAddress; public void SetAddress(ulong virtualAddress) => VirtualAddress = virtualAddress;