IL2CPP: Fix incorrect resolution of FieldRefs in MetadataUsages
This commit is contained in:
@@ -51,6 +51,7 @@ namespace Il2CppInspector
|
|||||||
public int[] NestedTypeIndices => Metadata.NestedTypeIndices;
|
public int[] NestedTypeIndices => Metadata.NestedTypeIndices;
|
||||||
public int[] AttributeTypeIndices => Metadata.AttributeTypeIndices;
|
public int[] AttributeTypeIndices => Metadata.AttributeTypeIndices;
|
||||||
public uint[] VTableMethodIndices => Metadata.VTableMethodIndices;
|
public uint[] VTableMethodIndices => Metadata.VTableMethodIndices;
|
||||||
|
public Il2CppFieldRef[] FieldRefs => Metadata.FieldRefs;
|
||||||
public Dictionary<int, (ulong, object)> FieldDefaultValue { get; } = new Dictionary<int, (ulong, object)>();
|
public Dictionary<int, (ulong, object)> FieldDefaultValue { get; } = new Dictionary<int, (ulong, object)>();
|
||||||
public Dictionary<int, (ulong, object)> ParameterDefaultValue { get; } = new Dictionary<int, (ulong, object)>();
|
public Dictionary<int, (ulong, object)> ParameterDefaultValue { get; } = new Dictionary<int, (ulong, object)>();
|
||||||
public List<long> FieldOffsets { get; }
|
public List<long> FieldOffsets { get; }
|
||||||
|
|||||||
@@ -144,10 +144,10 @@ namespace Il2CppInspector.Reflection
|
|||||||
return $"{method.DeclaringType.Name}.{method.Name}";
|
return $"{method.DeclaringType.Name}.{method.Name}";
|
||||||
|
|
||||||
case MetadataUsageType.FieldInfo:
|
case MetadataUsageType.FieldInfo:
|
||||||
var field = Package.Fields[usage.SourceIndex];
|
var fieldRef = Package.FieldRefs[usage.SourceIndex];
|
||||||
type = GetTypeFromUsage(field.typeIndex);
|
type = GetTypeFromUsage(fieldRef.typeIndex);
|
||||||
var fieldName = Package.Strings[field.nameIndex];
|
var field = type.DeclaredFields.First(f => f.Index == type.Definition.fieldStart + fieldRef.fieldIndex);
|
||||||
return $"{type.Name}.{fieldName}";
|
return $"{type.Name}.{field.Name}";
|
||||||
|
|
||||||
case MetadataUsageType.StringLiteral:
|
case MetadataUsageType.StringLiteral:
|
||||||
return Package.StringLiterals[usage.SourceIndex];
|
return Package.StringLiterals[usage.SourceIndex];
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ namespace Il2CppInspector
|
|||||||
public Il2CppInterfaceOffsetPair[] InterfaceOffsets { get; }
|
public Il2CppInterfaceOffsetPair[] InterfaceOffsets { get; }
|
||||||
public Il2CppMetadataUsageList[] MetadataUsageLists { get; }
|
public Il2CppMetadataUsageList[] MetadataUsageLists { get; }
|
||||||
public Il2CppMetadataUsagePair[] MetadataUsagePairs { get; }
|
public Il2CppMetadataUsagePair[] MetadataUsagePairs { get; }
|
||||||
|
public Il2CppFieldRef[] FieldRefs { get; }
|
||||||
|
|
||||||
public int[] InterfaceUsageIndices { get; }
|
public int[] InterfaceUsageIndices { get; }
|
||||||
public int[] NestedTypeIndices { get; }
|
public int[] NestedTypeIndices { get; }
|
||||||
@@ -127,6 +128,7 @@ namespace Il2CppInspector
|
|||||||
if (Version >= 19) {
|
if (Version >= 19) {
|
||||||
MetadataUsageLists = ReadArray<Il2CppMetadataUsageList>(Header.metadataUsageListsOffset, Header.metadataUsageListsCount / Sizeof(typeof(Il2CppMetadataUsageList)));
|
MetadataUsageLists = ReadArray<Il2CppMetadataUsageList>(Header.metadataUsageListsOffset, Header.metadataUsageListsCount / Sizeof(typeof(Il2CppMetadataUsageList)));
|
||||||
MetadataUsagePairs = ReadArray<Il2CppMetadataUsagePair>(Header.metadataUsagePairsOffset, Header.metadataUsagePairsCount / Sizeof(typeof(Il2CppMetadataUsagePair)));
|
MetadataUsagePairs = ReadArray<Il2CppMetadataUsagePair>(Header.metadataUsagePairsOffset, Header.metadataUsagePairsCount / Sizeof(typeof(Il2CppMetadataUsagePair)));
|
||||||
|
FieldRefs = ReadArray<Il2CppFieldRef>(Header.fieldRefsOffset, Header.fieldRefsCount / Sizeof(typeof(Il2CppFieldRef)));
|
||||||
}
|
}
|
||||||
if (Version >= 21) {
|
if (Version >= 21) {
|
||||||
AttributeTypeIndices = ReadArray<int>(Header.attributeTypesOffset, Header.attributeTypesCount / sizeof(int));
|
AttributeTypeIndices = ReadArray<int>(Header.attributeTypesOffset, Header.attributeTypesCount / sizeof(int));
|
||||||
|
|||||||
@@ -439,4 +439,10 @@ namespace Il2CppInspector
|
|||||||
public int length;
|
public int length;
|
||||||
public int dataIndex;
|
public int dataIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class Il2CppFieldRef
|
||||||
|
{
|
||||||
|
public int typeIndex;
|
||||||
|
public int fieldIndex; // local offset into type fields
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user