|
1 | 1 | using System;
|
2 | 2 | using System.Collections.Generic;
|
3 |
| -using System.Diagnostics; |
4 | 3 | using System.Linq;
|
5 | 4 | using AsmResolver;
|
6 | 5 | using AsmResolver.DotNet;
|
7 |
| -using AsmResolver.DotNet.Code.Cil; |
8 | 6 | using AsmResolver.DotNet.Signatures;
|
9 | 7 | using AsmResolver.DotNet.Signatures.Types;
|
10 |
| -using AsmResolver.PE.DotNet.Cil; |
11 | 8 | using AsmResolver.PE.DotNet.Metadata.Tables.Rows;
|
12 | 9 | using Cpp2IL.Core.Model.Contexts;
|
13 | 10 | using Cpp2IL.Core.Model.CustomAttributes;
|
| 11 | +using LibCpp2IL.BinaryStructures; |
14 | 12 | using LibCpp2IL.Metadata;
|
15 | 13 | using LibCpp2IL.Reflection;
|
16 | 14 |
|
@@ -97,14 +95,28 @@ private static CustomAttributeArgument BuildArrayArgument(AssemblyDefinition par
|
97 | 95 | return BuildEmptyArrayArgument(parentAssembly, arrayParameter);
|
98 | 96 |
|
99 | 97 | var typeSig = GetTypeSigFromAttributeArg(parentAssembly, arrayParameter);
|
100 |
| - |
101 |
| - return new(typeSig, arrayParameter.ArrayElements.Select(e => e switch |
| 98 | + |
| 99 | + var isObjectArray = arrayParameter.ArrType == Il2CppTypeEnum.IL2CPP_TYPE_OBJECT; |
| 100 | + |
| 101 | + var arrayElements = arrayParameter.ArrayElements.Select(e => |
102 | 102 | {
|
103 |
| - CustomAttributePrimitiveParameter primitiveParameter => primitiveParameter.PrimitiveValue, |
104 |
| - CustomAttributeEnumParameter enumParameter => enumParameter.UnderlyingPrimitiveParameter.PrimitiveValue, |
105 |
| - CustomAttributeTypeParameter type => (object)AsmResolverUtils.GetTypeSignatureFromIl2CppType(parentAssembly.ManifestModule!, type.Type!), |
106 |
| - _ => throw new("Not supported array element type: " + e.GetType().FullName) |
107 |
| - }).ToArray()); |
| 103 | + var rawValue = e switch |
| 104 | + { |
| 105 | + CustomAttributePrimitiveParameter primitiveParameter => primitiveParameter.PrimitiveValue, |
| 106 | + CustomAttributeEnumParameter enumParameter => enumParameter.UnderlyingPrimitiveParameter.PrimitiveValue, |
| 107 | + CustomAttributeTypeParameter type => (object)AsmResolverUtils.GetTypeSignatureFromIl2CppType(parentAssembly.ManifestModule!, type.Type!), |
| 108 | + _ => throw new("Not supported array element type: " + e.GetType().FullName) |
| 109 | + }; |
| 110 | + |
| 111 | + if (isObjectArray) |
| 112 | + //Object params have to be boxed |
| 113 | + return new BoxedArgument(GetTypeSigFromAttributeArg(parentAssembly, e), rawValue); |
| 114 | + |
| 115 | + return rawValue; |
| 116 | + |
| 117 | + }).ToArray(); |
| 118 | + |
| 119 | + return new(typeSig, arrayElements); |
108 | 120 | }
|
109 | 121 | catch (Exception e)
|
110 | 122 | {
|
|
0 commit comments