Skip to content

Commit 1a8c45e

Browse files
ds5678SamboyCoding
authored andcommitted
Upgrade to AsmResolver 6 beta 6
1 parent 558ddd9 commit 1a8c45e

File tree

6 files changed

+25
-63
lines changed

6 files changed

+25
-63
lines changed

Cpp2IL.Core/Cpp2IL.Core.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@
4040

4141
<ItemGroup>
4242
<!--Needed for DLL output-->
43-
<PackageReference Include="AsmResolver.DotNet" Version="6.0.0-beta.5" />
44-
<PackageReference Include="AssetRipper.CIL" Version="1.2.2" />
43+
<PackageReference Include="AsmResolver.DotNet" Version="6.0.0-beta.6" />
44+
<PackageReference Include="AssetRipper.CIL" Version="1.3.0" />
4545

4646
<!--For ARM64 dissassembly-->
4747
<PackageReference Include="Disarm" Version="2022.1.0-master.99" />

Cpp2IL.Core/OutputFormats/AsmResolverDummyDllOutputFormat.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -147,26 +147,25 @@ protected virtual void FillMethodBodies(AssemblyAnalysisContext context)
147147

148148
private List<AssemblyDefinition> BuildStubAssemblies(ApplicationAnalysisContext context)
149149
{
150-
var assemblyResolver = new Il2CppAssemblyResolver();
151-
var metadataResolver = new DefaultMetadataResolver(assemblyResolver);
152-
153150
var corlib = context.Assemblies.First(a => a.Name == "mscorlib");
154-
MostRecentCorLib = BuildStubAssembly(corlib, null, metadataResolver);
155-
assemblyResolver.DummyAssemblies.Add(MostRecentCorLib.Name!, MostRecentCorLib);
151+
MostRecentCorLib = BuildStubAssembly(corlib, null, null);
152+
153+
var runtimeContext = new RuntimeContext(DotNetRuntimeInfo.NetCoreApp(9, 0), (bool?)null, MostRecentCorLib);
154+
runtimeContext.AddAssembly(MostRecentCorLib);
155+
156+
context.PutExtraData("AsmResolverRuntimeContext", runtimeContext);
156157

157158
var ret = context.Assemblies
158159
// .AsParallel()
159160
.Where(a => a.Name != "mscorlib")
160-
.Select(a => BuildStubAssembly(a, MostRecentCorLib, metadataResolver))
161+
.Select(a => BuildStubAssembly(a, MostRecentCorLib, runtimeContext))
161162
.ToList();
162163

163-
ret.ForEach(a => assemblyResolver.DummyAssemblies.Add(a.Name!, a));
164-
165164
ret.Add(MostRecentCorLib);
166165
return ret;
167166
}
168167

169-
private static AssemblyDefinition BuildStubAssembly(AssemblyAnalysisContext assemblyContext, AssemblyDefinition? corLib, IMetadataResolver metadataResolver)
168+
private static AssemblyDefinition BuildStubAssembly(AssemblyAnalysisContext assemblyContext, AssemblyDefinition? corLib, RuntimeContext? runtimeContext)
170169
{
171170
//Get the name of the assembly (= the name of the DLL without the file extension)
172171
//Build an AsmResolver assembly from this definition
@@ -182,12 +181,11 @@ private static AssemblyDefinition BuildStubAssembly(AssemblyAnalysisContext asse
182181
var moduleName = assemblyContext.CleanAssemblyName + ".dll";
183182

184183
//Use either ourself as corlib, if we are corlib, otherwise the provided one
185-
var managedModule = new ModuleDefinition(moduleName, corLib is not null ? new(corLib) : null)
186-
{
187-
MetadataResolver = metadataResolver
188-
};
184+
var managedModule = new ModuleDefinition(moduleName, corLib is not null ? new(corLib) : null);
189185
ourAssembly.Modules.Add(managedModule);
190186

187+
runtimeContext?.AddAssembly(ourAssembly);
188+
191189
foreach (var il2CppTypeDefinition in assemblyContext.TopLevelTypes)
192190
{
193191
if (il2CppTypeDefinition.Name != "<Module>")

Cpp2IL.Core/Utils/AsmResolver/AsmResolverAssemblyPopulator.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ private static void CopyEventsInType(ReferenceImporter importer, TypeAnalysisCon
500500
public static void AddExplicitInterfaceImplementations(AssemblyAnalysisContext asmContext)
501501
{
502502
var managedAssembly = asmContext.GetExtraData<AssemblyDefinition>("AsmResolverAssembly") ?? throw new("AsmResolver assembly not found in assembly analysis context for " + asmContext);
503+
var runtimeContext = asmContext.AppContext.GetExtraData<RuntimeContext>("AsmResolverRuntimeContext") ?? throw new("AsmResolver runtime context not found in application analysis context");
503504

504505
var importer = managedAssembly.ManifestModule!.DefaultImporter;
505506

@@ -514,7 +515,7 @@ public static void AddExplicitInterfaceImplementations(AssemblyAnalysisContext a
514515
try
515516
#endif
516517
{
517-
AddExplicitInterfaceImplementations(managedType, typeContext, importer);
518+
AddExplicitInterfaceImplementations(managedType, typeContext, importer, runtimeContext);
518519
}
519520
#if !DEBUG
520521
catch (Exception e)
@@ -525,7 +526,7 @@ public static void AddExplicitInterfaceImplementations(AssemblyAnalysisContext a
525526
}
526527
}
527528

528-
private static void AddExplicitInterfaceImplementations(TypeDefinition type, TypeAnalysisContext typeContext, ReferenceImporter importer)
529+
private static void AddExplicitInterfaceImplementations(TypeDefinition type, TypeAnalysisContext typeContext, ReferenceImporter importer, RuntimeContext runtimeContext)
529530
{
530531
List<(PropertyDefinition InterfaceProperty, TypeSignature InterfaceType, MethodDefinition Method)>? getMethodsToCreate = null;
531532
List<(PropertyDefinition InterfaceProperty, TypeSignature InterfaceType, MethodDefinition Method)>? setMethodsToCreate = null;
@@ -540,20 +541,20 @@ private static void AddExplicitInterfaceImplementations(TypeDefinition type, Typ
540541
var interfaceMethod = (IMethodDefOrRef)overrideContext.ToMethodDescriptor(importer.TargetModule);
541542
var method = methodContext.GetExtraData<MethodDefinition>("AsmResolverMethod") ?? throw new($"AsmResolver method not found in method analysis context for {methodContext}");
542543
type.MethodImplementations.Add(new MethodImplementation(interfaceMethod, method));
543-
var interfaceMethodResolved = interfaceMethod.Resolve();
544-
if (interfaceMethodResolved != null)
544+
var resolutionStatus = interfaceMethod.Resolve(runtimeContext, out var interfaceMethodResolved);
545+
if (resolutionStatus is ResolutionStatus.Success && interfaceMethodResolved != null)
545546
{
546547
if (interfaceMethodResolved.IsGetMethod && !method.IsGetMethod)
547548
{
548549
getMethodsToCreate ??= [];
549550
var interfacePropertyResolved = interfaceMethodResolved.DeclaringType!.Properties.First(p => p.Semantics.Contains(interfaceMethodResolved.Semantics));
550-
getMethodsToCreate.Add((interfacePropertyResolved, interfaceMethod.DeclaringType!.ToTypeSignature(), method));
551+
getMethodsToCreate.Add((interfacePropertyResolved, interfaceMethod.DeclaringType!.ToTypeSignature(runtimeContext), method));
551552
}
552553
else if (interfaceMethodResolved.IsSetMethod && !method.IsSetMethod)
553554
{
554555
setMethodsToCreate ??= [];
555556
var interfacePropertyResolved = interfaceMethodResolved.DeclaringType!.Properties.First(p => p.Semantics.Contains(interfaceMethodResolved.Semantics));
556-
setMethodsToCreate.Add((interfacePropertyResolved, interfaceMethod.DeclaringType!.ToTypeSignature(), method));
557+
setMethodsToCreate.Add((interfacePropertyResolved, interfaceMethod.DeclaringType!.ToTypeSignature(runtimeContext), method));
557558
}
558559
}
559560
}
@@ -566,7 +567,7 @@ private static void AddExplicitInterfaceImplementations(TypeDefinition type, Typ
566567
{
567568
var (interfaceProperty, interfaceType, getMethod) = entry;
568569
var setMethod = setMethodsToCreate?
569-
.FirstOrDefault(e => e.InterfaceProperty == interfaceProperty && SignatureComparer.Default.Equals(e.InterfaceType, interfaceType))
570+
.FirstOrDefault(e => e.InterfaceProperty == interfaceProperty && runtimeContext.SignatureComparer.Equals(e.InterfaceType, interfaceType))
570571
.Method;
571572

572573
var name = $"{interfaceType.FullName}.{interfaceProperty.Name}";
@@ -583,7 +584,7 @@ private static void AddExplicitInterfaceImplementations(TypeDefinition type, Typ
583584
foreach (var entry in setMethodsToCreate)
584585
{
585586
var (interfaceProperty, interfaceType, setMethod) = entry;
586-
if (getMethodsToCreate?.Any(e => e.InterfaceProperty == interfaceProperty && SignatureComparer.Default.Equals(e.InterfaceType, interfaceType)) == true)
587+
if (getMethodsToCreate?.Any(e => e.InterfaceProperty == interfaceProperty && runtimeContext.SignatureComparer.Equals(e.InterfaceType, interfaceType)) == true)
587588
continue;
588589
var name = $"{interfaceType.FullName}.{interfaceProperty.Name}";
589590
var propertySignature = setMethod.IsStatic

Cpp2IL.Core/Utils/AsmResolver/AsmResolverUtils.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ public static TypeDefinition GetPrimitiveTypeDef(Il2CppTypeEnum type) =>
143143
typeArguments[i] = typeArgument;
144144
}
145145

146-
return baseType.MakeGenericInstanceType(typeArguments);
146+
var runtimeContext = Cpp2IlApi.CurrentAppContext!.GetExtraData<RuntimeContext>("RuntimeContext") ?? throw new("AsmResolver runtime context not found in application analysis context");
147+
return baseType.MakeGenericInstanceType(runtimeContext, typeArguments);
147148
}
148149

149150
private readonly record struct ParsedTypeString(string BaseType, string Suffix, string[] GenericArguments);

Cpp2IL.Core/Utils/AsmResolver/ContextToTypeSignature.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ private static TypeDefinition GetTypeDefinition(this TypeAnalysisContext context
1717
public static TypeSignature ToTypeSignature(this TypeAnalysisContext context, ModuleDefinition parentModule) => context switch
1818
{
1919
ReferencedTypeAnalysisContext referencedTypeAnalysisContext => referencedTypeAnalysisContext.ToTypeSignature(parentModule),
20-
_ => parentModule.DefaultImporter.ImportType(context.GetTypeDefinition()).ToTypeSignature()
20+
_ => parentModule.DefaultImporter.ImportType(context.GetTypeDefinition()).ToTypeSignature(parentModule.RuntimeContext)
2121
};
2222

2323
public static TypeSignature ToTypeSignature(this ReferencedTypeAnalysisContext context, ModuleDefinition parentModule) => context switch

Cpp2IL.Core/Utils/AsmResolver/Il2CppAssemblyResolver.cs

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)