simplify custom attribute logic a bit by always returning arrays as ConstantBlobArrayElement
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(", ");
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user