Skip to content

Commit d8a7de4

Browse files
committed
Core: DummyDll: Fix how we handle object arrays in attrs
1 parent ddf4f59 commit d8a7de4

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

Cpp2IL.Core/Utils/AsmResolver/AsmResolverAssemblyPopulator.cs

+22-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Diagnostics;
43
using System.Linq;
54
using AsmResolver;
65
using AsmResolver.DotNet;
7-
using AsmResolver.DotNet.Code.Cil;
86
using AsmResolver.DotNet.Signatures;
97
using AsmResolver.DotNet.Signatures.Types;
10-
using AsmResolver.PE.DotNet.Cil;
118
using AsmResolver.PE.DotNet.Metadata.Tables.Rows;
129
using Cpp2IL.Core.Model.Contexts;
1310
using Cpp2IL.Core.Model.CustomAttributes;
11+
using LibCpp2IL.BinaryStructures;
1412
using LibCpp2IL.Metadata;
1513
using LibCpp2IL.Reflection;
1614

@@ -97,14 +95,28 @@ private static CustomAttributeArgument BuildArrayArgument(AssemblyDefinition par
9795
return BuildEmptyArrayArgument(parentAssembly, arrayParameter);
9896

9997
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 =>
102102
{
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);
108120
}
109121
catch (Exception e)
110122
{

0 commit comments

Comments
 (0)