simplify custom attribute logic a bit by always returning arrays as ConstantBlobArrayElement

This commit is contained in:
LukeFZ
2023-12-01 06:46:58 +01:00
parent 6aa96b431d
commit 227aefedef
5 changed files with 19 additions and 38 deletions

View File

@@ -103,15 +103,17 @@ namespace Il2CppInspector
var type = BlobReader.ReadEncodedTypeEnum(_inspector, _data, out var typeDef); var type = BlobReader.ReadEncodedTypeEnum(_inspector, _data, out var typeDef);
var value = BlobReader.GetConstantValueFromBlob(_inspector, type, _data); var value = BlobReader.GetConstantValueFromBlob(_inspector, type, _data);
if (value is BlobReader.ConstantBlobArray blobArray) value = ConvertAttributeValue(value);
if (value is CustomAttributeArgument valueAttr)
{ {
arg.Type = ConvertTypeDef(blobArray.ArrayTypeDef, blobArray.ArrayTypeEnum); arg.Type = valueAttr.Type;
arg.Value = blobArray.Elements.Select(ConvertAttributeValue).ToArray(); arg.Value = valueAttr.Value;
} }
else else
{ {
arg.Type = ConvertTypeDef(typeDef, type); arg.Type = ConvertTypeDef(typeDef, type);
arg.Value = ConvertAttributeValue(value); arg.Value = value;
} }
} }
@@ -126,21 +128,15 @@ namespace Il2CppInspector
var arrValue = new CustomAttributeArgument var arrValue = new CustomAttributeArgument
{ {
Type = ConvertTypeDef(blobArray.ArrayTypeDef, blobArray.ArrayTypeEnum), Type = ConvertTypeDef(blobArray.ArrayTypeDef, blobArray.ArrayTypeEnum),
Value = blobArray.Elements.Select(ConvertAttributeValue).ToArray() Value = blobArray.Elements.Select(blobElem => new CustomAttributeArgument
{
Type = ConvertTypeDef(blobElem.TypeDef, blobElem.TypeEnum),
Value = ConvertAttributeValue(blobElem.Value)
}).ToArray()
}; };
return arrValue; return arrValue;
} }
case BlobReader.ConstantBlobArrayElement blobElem:
{
var subArgument = new CustomAttributeArgument
{
Type = ConvertTypeDef(blobElem.TypeDef, blobElem.TypeEnum),
Value = blobElem.Value
};
return subArgument;
}
default: default:
return value; return value;
} }

View File

@@ -479,13 +479,6 @@ namespace Il2CppInspector.Outputs
case CustomAttributeArgument[] argumentArray: case CustomAttributeArgument[] argumentArray:
return new CAArgument(new SZArraySig(typeSig), return new CAArgument(new SZArraySig(typeSig),
argumentArray.Select(GetArgument).ToList()); argumentArray.Select(GetArgument).ToList());
case object[] caArray:
return new CAArgument(new SZArraySig(typeSig),
caArray.Select(x => new CustomAttributeArgument
{
Type = argument.Type,
Value = x
}).Select(GetArgument).ToList());
default: default:
return new CAArgument(typeSig, argument.Value); return new CAArgument(typeSig, argument.Value);
} }

View File

@@ -75,10 +75,6 @@ namespace Il2CppInspector.Reflection
foreach (var info in GetTypeReferences(array)) foreach (var info in GetTypeReferences(array))
yield return info; yield return info;
break; break;
case TypeInfo[] infos:
foreach (var info in infos)
yield return info;
break;
} }
} }
} }

View File

@@ -209,7 +209,7 @@ namespace Il2CppInspector.Reflection
} }
case TypeInfo typeInfo: case TypeInfo typeInfo:
return $"typeof({typeInfo.GetScopedCSharpName(usingScope)})"; return $"typeof({typeInfo.GetScopedCSharpName(usingScope)})";
case object[] array: case CustomAttributeArgument[] array:
var arraySb = new StringBuilder(); var arraySb = new StringBuilder();
arraySb.Append("new "); arraySb.Append("new ");
arraySb.Append(type.GetScopedCSharpName(usingScope)); arraySb.Append(type.GetScopedCSharpName(usingScope));
@@ -222,8 +222,7 @@ namespace Il2CppInspector.Reflection
arraySb.Append(" {"); arraySb.Append(" {");
for (int i = 0; i < array.Length; i++) for (int i = 0; i < array.Length; i++)
{ {
if (array[i] is CustomAttributeArgument arrayArgument) // Used for array with different entries, see BlobReader for more info arraySb.Append(array[i].Value.ToCSharpValue(array[i].Type, usingScope));
arraySb.Append(arrayArgument.Value.ToCSharpValue(arrayArgument.Type, usingScope));
if (i + 1 != array.Length) if (i + 1 != array.Length)
arraySb.Append(", "); arraySb.Append(", ");

View File

@@ -78,27 +78,24 @@ public static class BlobReader
var arrayElementType = ReadEncodedTypeEnum(inspector, blob, out var arrayElementDef); var arrayElementType = ReadEncodedTypeEnum(inspector, blob, out var arrayElementDef);
var arrayElementsAreDifferent = blob.ReadByte(); var arrayElementsAreDifferent = blob.ReadByte();
var array = new ConstantBlobArrayElement[length];
if (arrayElementsAreDifferent == kArrayTypeWithDifferentElements) if (arrayElementsAreDifferent == kArrayTypeWithDifferentElements)
{ {
var array = new ConstantBlobArrayElement[length];
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
var elementType = ReadEncodedTypeEnum(inspector, blob, out var elementTypeDef); var elementType = ReadEncodedTypeEnum(inspector, blob, out var elementTypeDef);
array[i] = new ConstantBlobArrayElement(elementTypeDef, GetConstantValueFromBlob(inspector, elementType, blob), elementType); array[i] = new ConstantBlobArrayElement(elementTypeDef, GetConstantValueFromBlob(inspector, elementType, blob), elementType);
} }
value = new ConstantBlobArray(arrayElementDef, array, true, arrayElementType);
} }
else else
{ {
var array = new object[length];
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
array[i] = GetConstantValueFromBlob(inspector, arrayElementType, blob); array[i] = new ConstantBlobArrayElement(arrayElementDef, GetConstantValueFromBlob(inspector, arrayElementType, blob), arrayElementType);
}
} }
value = new ConstantBlobArray(arrayElementDef, array, false, arrayElementType); value = new ConstantBlobArray(arrayElementDef, array, arrayElementType);
}
break; break;
@@ -133,9 +130,9 @@ public static class BlobReader
var typeIndex = blob.ReadCompressedInt32(); var typeIndex = blob.ReadCompressedInt32();
var typeHandle = (uint)inspector.TypeReferences[typeIndex].datapoint; var typeHandle = (uint)inspector.TypeReferences[typeIndex].datapoint;
enumType = inspector.TypeDefinitions[typeHandle]; enumType = inspector.TypeDefinitions[typeHandle];
var elementTypeHandle = inspector.TypeReferences[enumType.elementTypeIndex].datapoint; var elementTypeHandle = inspector.TypeReferences[enumType.elementTypeIndex].datapoint;
var elementType = inspector.TypeDefinitions[elementTypeHandle]; var elementType = inspector.TypeDefinitions[elementTypeHandle];
typeEnum = inspector.TypeReferences[elementType.byvalTypeIndex].type; typeEnum = inspector.TypeReferences[elementType.byvalTypeIndex].type;
} }
// This technically also handles SZARRAY (System.Array) and all others by just returning their system type // This technically also handles SZARRAY (System.Array) and all others by just returning their system type
@@ -143,7 +140,7 @@ public static class BlobReader
return typeEnum; return typeEnum;
} }
public record ConstantBlobArray(Il2CppTypeDefinition ArrayTypeDef, object[] Elements, bool DifferentElements, Il2CppTypeEnum ArrayTypeEnum); public record ConstantBlobArray(Il2CppTypeDefinition ArrayTypeDef, ConstantBlobArrayElement[] Elements, Il2CppTypeEnum ArrayTypeEnum);
public record ConstantBlobArrayElement(Il2CppTypeDefinition TypeDef, object Value, Il2CppTypeEnum TypeEnum); public record ConstantBlobArrayElement(Il2CppTypeDefinition TypeDef, object Value, Il2CppTypeEnum TypeEnum);
} }