Skip to content

Commit 06cd048

Browse files
authored
Port generator to use AsmResolver (#124)
1 parent 63e3948 commit 06cd048

File tree

72 files changed

+2321
-2026
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+2321
-2026
lines changed

Il2CppInterop.CLI/Utils.cs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,14 @@
1-
using Mono.Cecil;
1+
using AsmResolver.DotNet;
22

33
namespace Il2CppInterop;
44

55
internal static class Utils
66
{
77
public static List<AssemblyDefinition> LoadAssembliesFrom(DirectoryInfo directoryInfo)
88
{
9-
var resolver = new BasicResolver();
10-
var inputAssemblies = directoryInfo.EnumerateFiles("*.dll").Select(f => AssemblyDefinition.ReadAssembly(
11-
f.FullName,
12-
new ReaderParameters { AssemblyResolver = resolver })).ToList();
13-
foreach (var assembly in inputAssemblies)
14-
{
15-
resolver.Register(assembly);
16-
}
9+
var inputAssemblies = directoryInfo.EnumerateFiles("*.dll").Select(f => AssemblyDefinition.FromFile(
10+
f.FullName)).ToList();
1711

1812
return inputAssemblies;
1913
}
20-
21-
private class BasicResolver : DefaultAssemblyResolver
22-
{
23-
public void Register(AssemblyDefinition ad) => RegisterAssembly(ad);
24-
}
2514
}

Il2CppInterop.Generator/Contexts/AssemblyRewriteContext.cs

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
using System.Collections.Generic;
1+
using AsmResolver.DotNet;
2+
using AsmResolver.DotNet.Signatures;
23
using Il2CppInterop.Generator.Extensions;
34
using Il2CppInterop.Generator.Utils;
4-
using Mono.Cecil;
55

66
namespace Il2CppInterop.Generator.Contexts;
77

@@ -28,7 +28,7 @@ public AssemblyRewriteContext(RewriteGlobalContext globalContext, AssemblyDefini
2828
NewAssembly = newAssembly;
2929
GlobalContext = globalContext;
3030

31-
Imports = ImportsMap.GetOrCreate(newAssembly.MainModule,
31+
Imports = ImportsMap.GetOrCreate(newAssembly.ManifestModule!,
3232
mod => new RuntimeAssemblyReferences(mod, globalContext));
3333
}
3434

@@ -57,63 +57,66 @@ public void RegisterTypeRewrite(TypeRewriteContext context)
5757
myNameTypeMap[(context.OriginalType ?? context.NewType).FullName] = context;
5858
}
5959

60-
public MethodReference RewriteMethodRef(MethodReference methodRef)
60+
public IMethodDefOrRef RewriteMethodRef(IMethodDefOrRef methodRef)
6161
{
62-
var newType = GlobalContext.GetNewTypeForOriginal(methodRef.DeclaringType.Resolve());
63-
return newType.GetMethodByOldMethod(methodRef.Resolve()).NewMethod;
62+
var newType = GlobalContext.GetNewTypeForOriginal(methodRef.DeclaringType!.Resolve()!);
63+
var newMethod = newType.GetMethodByOldMethod(methodRef.Resolve()!).NewMethod;
64+
return NewAssembly.ManifestModule!.DefaultImporter.ImportMethod(newMethod);
6465
}
6566

66-
public TypeReference RewriteTypeRef(TypeReference? typeRef)
67+
public ITypeDefOrRef RewriteTypeRef(ITypeDescriptor typeRef)
6768
{
68-
if (typeRef == null) return Imports.Il2CppObjectBase;
69+
return RewriteTypeRef(typeRef?.ToTypeSignature()).ToTypeDefOrRef();
70+
}
71+
72+
public TypeSignature RewriteTypeRef(TypeSignature? typeRef)
73+
{
74+
if (typeRef == null)
75+
return Imports.Il2CppObjectBase;
6976

70-
var sourceModule = NewAssembly.MainModule;
77+
var sourceModule = NewAssembly.ManifestModule!;
7178

72-
if (typeRef is ArrayType arrayType)
79+
if (typeRef is ArrayBaseTypeSignature arrayType)
7380
{
7481
if (arrayType.Rank != 1)
7582
return Imports.Il2CppObjectBase;
7683

77-
var elementType = arrayType.ElementType;
84+
var elementType = arrayType.BaseType;
7885
if (elementType.FullName == "System.String")
7986
return Imports.Il2CppStringArray;
8087

8188
var convertedElementType = RewriteTypeRef(elementType);
82-
if (elementType.IsGenericParameter)
83-
return new GenericInstanceType(Imports.Il2CppArrayBase) { GenericArguments = { convertedElementType } };
89+
if (elementType is GenericParameterSignature)
90+
return new GenericInstanceTypeSignature(Imports.Il2CppArrayBase.ToTypeDefOrRef(), false, convertedElementType);
8491

85-
return new GenericInstanceType(convertedElementType.IsValueType
86-
? Imports.Il2CppStructArray
87-
: Imports.Il2CppReferenceArray)
88-
{ GenericArguments = { convertedElementType } };
92+
return new GenericInstanceTypeSignature(convertedElementType.IsValueType
93+
? Imports.Il2CppStructArray.ToTypeDefOrRef()
94+
: Imports.Il2CppReferenceArray.ToTypeDefOrRef(), false, convertedElementType);
8995
}
9096

91-
if (typeRef is GenericParameter genericParameter)
97+
if (typeRef is GenericParameterSignature genericParameter)
9298
{
93-
var genericParameterDeclaringType = genericParameter.DeclaringType;
94-
if (genericParameterDeclaringType != null)
95-
return RewriteTypeRef(genericParameterDeclaringType).GenericParameters[genericParameter.Position];
96-
97-
return RewriteMethodRef(genericParameter.DeclaringMethod).GenericParameters[genericParameter.Position];
99+
return new GenericParameterSignature(sourceModule, genericParameter.ParameterType, genericParameter.Index);
98100
}
99101

100-
if (typeRef is ByReferenceType byRef)
101-
return new ByReferenceType(RewriteTypeRef(byRef.ElementType));
102+
if (typeRef is ByReferenceTypeSignature byRef)
103+
return new ByReferenceTypeSignature(RewriteTypeRef(byRef.BaseType));
102104

103-
if (typeRef is PointerType pointerType)
104-
return new PointerType(RewriteTypeRef(pointerType.ElementType));
105+
if (typeRef is PointerTypeSignature pointerType)
106+
return new PointerTypeSignature(RewriteTypeRef(pointerType.BaseType));
105107

106-
if (typeRef is GenericInstanceType genericInstance)
108+
if (typeRef is GenericInstanceTypeSignature genericInstance)
107109
{
108-
var newRef = new GenericInstanceType(RewriteTypeRef(genericInstance.ElementType));
109-
foreach (var originalParameter in genericInstance.GenericArguments)
110-
newRef.GenericArguments.Add(RewriteTypeRef(originalParameter));
110+
var genericType = RewriteTypeRef(genericInstance.GenericType.ToTypeSignature()).ToTypeDefOrRef();
111+
var newRef = new GenericInstanceTypeSignature(genericType, genericType.IsValueType);
112+
foreach (var originalParameter in genericInstance.TypeArguments)
113+
newRef.TypeArguments.Add(RewriteTypeRef(originalParameter));
111114

112115
return newRef;
113116
}
114117

115-
if (typeRef.IsPrimitive || typeRef.FullName == "System.TypedReference")
116-
return sourceModule.ImportCorlibReference(typeRef.Namespace, typeRef.Name);
118+
if (typeRef.IsPrimitive() || typeRef.FullName == "System.TypedReference")
119+
return sourceModule.ImportCorlibReference(typeRef.FullName);
117120

118121
if (typeRef.FullName == "System.Void")
119122
return Imports.Module.Void();
@@ -122,18 +125,18 @@ public TypeReference RewriteTypeRef(TypeReference? typeRef)
122125
return Imports.Module.String();
123126

124127
if (typeRef.FullName == "System.Object")
125-
return sourceModule.ImportReference(GlobalContext.GetAssemblyByName("mscorlib")
126-
.GetTypeByName("System.Object").NewType);
128+
return sourceModule.DefaultImporter.ImportType(GlobalContext.GetAssemblyByName("mscorlib")
129+
.GetTypeByName("System.Object").NewType).ToTypeSignature();
127130

128131
if (typeRef.FullName == "System.Attribute")
129-
return sourceModule.ImportReference(GlobalContext.GetAssemblyByName("mscorlib")
130-
.GetTypeByName("System.Attribute").NewType);
132+
return sourceModule.DefaultImporter.ImportType(GlobalContext.GetAssemblyByName("mscorlib")
133+
.GetTypeByName("System.Attribute").NewType).ToTypeSignature();
131134

132-
var originalTypeDef = typeRef.Resolve();
133-
var targetAssembly = GlobalContext.GetNewAssemblyForOriginal(originalTypeDef.Module.Assembly);
135+
var originalTypeDef = typeRef.Resolve()!;
136+
var targetAssembly = GlobalContext.GetNewAssemblyForOriginal(originalTypeDef.Module!.Assembly!);
134137
var target = targetAssembly.GetContextForOriginalType(originalTypeDef).NewType;
135138

136-
return sourceModule.ImportReference(target);
139+
return sourceModule.DefaultImporter.ImportType(target).ToTypeSignature();
137140
}
138141

139142
public TypeRewriteContext GetTypeByName(string name)

Il2CppInterop.Generator/Contexts/FieldRewriteContext.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Diagnostics;
2+
using AsmResolver.DotNet;
3+
using AsmResolver.DotNet.Signatures;
4+
using AsmResolver.PE.DotNet.Metadata.Tables;
35
using Il2CppInterop.Generator.Extensions;
46
using Il2CppInterop.Generator.Utils;
5-
using Mono.Cecil;
67

78
namespace Il2CppInterop.Generator.Contexts;
89

@@ -14,7 +15,7 @@ public class FieldRewriteContext
1415
public readonly TypeRewriteContext DeclaringType;
1516
public readonly FieldDefinition OriginalField;
1617

17-
public readonly FieldReference PointerField;
18+
public readonly MemberReference PointerField;
1819
public readonly string UnmangledName;
1920

2021
public FieldRewriteContext(TypeRewriteContext declaringType, FieldDefinition originalField,
@@ -31,35 +32,39 @@ public FieldRewriteContext(TypeRewriteContext declaringType, FieldDefinition ori
3132

3233
declaringType.NewType.Fields.Add(pointerField);
3334

34-
PointerField = new FieldReference(pointerField.Name, pointerField.FieldType, DeclaringType.SelfSubstitutedRef);
35+
Debug.Assert(pointerField.Signature is not null);
36+
PointerField = new MemberReference(DeclaringType.SelfSubstitutedRef, pointerField.Name, new FieldSignature(pointerField.Signature!.FieldType));
3537
}
3638

3739
private string UnmangleFieldNameBase(FieldDefinition field, GeneratorOptions options)
3840
{
39-
if (options.PassthroughNames) return field.Name;
41+
if (options.PassthroughNames)
42+
return field.Name!;
4043

4144
if (!field.Name.IsObfuscated(options))
4245
{
4346
if (!field.Name.IsInvalidInSource())
44-
return field.Name;
47+
return field.Name!;
4548
return field.Name.FilterInvalidInSourceChars();
4649
}
4750

51+
Debug.Assert(field.Signature is not null);
4852
var accessModString = MethodAccessTypeLabels[(int)(field.Attributes & FieldAttributes.FieldAccessMask)];
4953
var staticString = field.IsStatic ? "_Static" : "";
5054
return "field_" + accessModString + staticString + "_" +
51-
DeclaringType.AssemblyContext.RewriteTypeRef(field.FieldType).GetUnmangledName();
55+
DeclaringType.AssemblyContext.RewriteTypeRef(field.Signature!.FieldType).GetUnmangledName(field.DeclaringType);
5256
}
5357

5458
private string UnmangleFieldName(FieldDefinition field, GeneratorOptions options,
5559
Dictionary<string, int>? renamedFieldCounts)
5660
{
57-
if (options.PassthroughNames) return field.Name;
61+
if (options.PassthroughNames)
62+
return field.Name!;
5863

5964
if (!field.Name.IsObfuscated(options))
6065
{
6166
if (!field.Name.IsInvalidInSource())
62-
return field.Name;
67+
return field.Name!;
6368
return field.Name.FilterInvalidInSourceChars();
6469
}
6570

0 commit comments

Comments
 (0)