IL2CPP: Refactor metadata usage name discovery
This commit is contained in:
@@ -13,6 +13,15 @@ namespace Il2CppInspector
|
|||||||
{
|
{
|
||||||
public class Il2CppIDAScriptDumper
|
public class Il2CppIDAScriptDumper
|
||||||
{
|
{
|
||||||
|
private readonly Dictionary<MetadataUsageType, string> usagePrefixes = new Dictionary<MetadataUsageType, string> {
|
||||||
|
[MetadataUsageType.TypeInfo] = "Class",
|
||||||
|
[MetadataUsageType.Type] = "Class",
|
||||||
|
[MetadataUsageType.MethodDef] = "Method",
|
||||||
|
[MetadataUsageType.FieldInfo] = "Field",
|
||||||
|
[MetadataUsageType.StringLiteral] = "String",
|
||||||
|
[MetadataUsageType.MethodRef] = "Method"
|
||||||
|
};
|
||||||
|
|
||||||
private readonly Il2CppModel model;
|
private readonly Il2CppModel model;
|
||||||
private StreamWriter writer;
|
private StreamWriter writer;
|
||||||
|
|
||||||
@@ -69,32 +78,12 @@ index = 1
|
|||||||
|
|
||||||
private void writeUsages() {
|
private void writeUsages() {
|
||||||
foreach (var usage in model.Package.MetadataUsages) {
|
foreach (var usage in model.Package.MetadataUsages) {
|
||||||
switch (usage.Type) {
|
|
||||||
case MetadataUsageType.TypeInfo:
|
|
||||||
case MetadataUsageType.Type:
|
|
||||||
var type = model.GetTypeFromUsage(usage.SourceIndex);
|
|
||||||
writeLines($"SetName({model.Package.BinaryMetadataUsages[usage.DestinationIndex].ToAddressString()}, 'Class${type.Name}')");
|
|
||||||
break;
|
|
||||||
case MetadataUsageType.MethodDef:
|
|
||||||
var method = model.MethodsByDefinitionIndex[usage.SourceIndex];
|
|
||||||
writeLines($"SetName({model.Package.BinaryMetadataUsages[usage.DestinationIndex].ToAddressString()}, 'Method${method.DeclaringType.Name}.{method.Name}')");
|
|
||||||
break;
|
|
||||||
case MetadataUsageType.FieldInfo:
|
|
||||||
var field = model.Package.Fields[usage.SourceIndex];
|
|
||||||
type = model.GetTypeFromUsage(field.typeIndex);
|
|
||||||
var fieldName = model.Package.Strings[field.nameIndex];
|
|
||||||
writeLines($"SetName({model.Package.BinaryMetadataUsages[usage.DestinationIndex].ToAddressString()}, 'Field${type.Name}.{fieldName}')");
|
|
||||||
break;
|
|
||||||
case MetadataUsageType.StringLiteral:
|
|
||||||
// TODO: String literals
|
// TODO: String literals
|
||||||
break;
|
if (usage.Type == MetadataUsageType.StringLiteral)
|
||||||
case MetadataUsageType.MethodRef:
|
continue;
|
||||||
var methodSpec = model.Package.MethodSpecs[usage.SourceIndex];
|
|
||||||
method = model.MethodsByDefinitionIndex[methodSpec.methodDefinitionIndex];
|
var address = model.Package.BinaryMetadataUsages[usage.DestinationIndex];
|
||||||
type = method.DeclaringType;
|
writeLines($"SetName({address.ToAddressString()}, '{usagePrefixes[usage.Type]}${model.GetMetadataUsageName(usage)}'");
|
||||||
writeLines($"SetName({model.Package.BinaryMetadataUsages[usage.DestinationIndex].ToAddressString()}, 'Method${type.Name}.{method.Name}')");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2017-2019 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
Copyright 2017-2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
*/
|
*/
|
||||||
@@ -130,5 +130,36 @@ namespace Il2CppInspector.Reflection
|
|||||||
return -1;
|
return -1;
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the name of a metadata usage
|
||||||
|
public string GetMetadataUsageName(MetadataUsage usage) {
|
||||||
|
switch (usage.Type) {
|
||||||
|
case MetadataUsageType.TypeInfo:
|
||||||
|
case MetadataUsageType.Type:
|
||||||
|
var type = GetTypeFromUsage(usage.SourceIndex);
|
||||||
|
return type.Name;
|
||||||
|
|
||||||
|
case MetadataUsageType.MethodDef:
|
||||||
|
var method = MethodsByDefinitionIndex[usage.SourceIndex];
|
||||||
|
return $"{method.DeclaringType.Name}.{method.Name}";
|
||||||
|
|
||||||
|
case MetadataUsageType.FieldInfo:
|
||||||
|
var field = Package.Fields[usage.SourceIndex];
|
||||||
|
type = GetTypeFromUsage(field.typeIndex);
|
||||||
|
var fieldName = Package.Strings[field.nameIndex];
|
||||||
|
return $"{type.Name}.{fieldName}";
|
||||||
|
|
||||||
|
case MetadataUsageType.StringLiteral:
|
||||||
|
// TODO: String literals
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
case MetadataUsageType.MethodRef:
|
||||||
|
var methodSpec = Package.MethodSpecs[usage.SourceIndex];
|
||||||
|
method = MethodsByDefinitionIndex[methodSpec.methodDefinitionIndex];
|
||||||
|
type = method.DeclaringType;
|
||||||
|
return $"{type.Name}.{method.Name}";
|
||||||
|
}
|
||||||
|
throw new NotImplementedException("Unknown metadata usage type: " + usage.Type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2019-2020 Carter Bush - https://github.com/carterbush
|
Copyright (c) 2019-2020 Carter Bush - https://github.com/carterbush
|
||||||
Copyright 2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
Copyright (c) 2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user