Skip to content

Commit 6663045

Browse files
committed
Fix generation inconsistencies with previous version
1 parent 8558a20 commit 6663045

File tree

7 files changed

+37
-18
lines changed

7 files changed

+37
-18
lines changed

Il2CppInterop.Generator/Contexts/AssemblyRewriteContext.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,25 @@ public IMethodDefOrRef RewriteMethodRef(IMethodDefOrRef methodRef)
7272
return NewAssembly.ManifestModule!.DefaultImporter.ImportMethod(newMethod);
7373
}
7474

75+
/// <summary>
76+
/// Rewrite passes type
77+
/// </summary>
78+
/// <param name="typeRef">type</param>
79+
/// <param name="context">generic context. Ensure you pass NEW types here</param>
80+
/// <param name="typeIsBoxed">are we rewriting boxed variant</param>
81+
/// <returns>new type</returns>
7582
public ITypeDefOrRef RewriteTypeRef(ITypeDescriptor typeRef, GenericParameterContext context = default, bool typeIsBoxed = false)
7683
{
7784
return RewriteTypeRef(typeRef?.ToTypeSignature(), context, typeIsBoxed).ToTypeDefOrRef();
7885
}
7986

87+
/// <summary>
88+
/// Rewrite passes type
89+
/// </summary>
90+
/// <param name="typeRef">type</param>
91+
/// <param name="context">generic context. Ensure you pass NEW types here</param>
92+
/// <param name="typeIsBoxed">are we rewriting boxed variant</param>
93+
/// <returns>new type</returns>
8094
public TypeSignature RewriteTypeRef(TypeSignature? typeRef, GenericParameterContext context = default, bool typeIsBoxed = false)
8195
{
8296
if (typeRef == null)

Il2CppInterop.Generator/Contexts/MethodRewriteContext.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
using AsmResolver.DotNet.Collections;
77
using AsmResolver.DotNet.Signatures;
88
using AsmResolver.PE.DotNet.Metadata.Tables;
9+
using Il2CppInterop.Common;
910
using Il2CppInterop.Common.XrefScans;
1011
using Il2CppInterop.Generator.Extensions;
1112
using Il2CppInterop.Generator.Passes;
1213
using Il2CppInterop.Generator.Utils;
14+
using Microsoft.Extensions.Logging;
1315

1416
namespace Il2CppInterop.Generator.Contexts;
1517

@@ -146,11 +148,14 @@ private bool HasGenericParameter(TypeSignature typeReference, GenericParameterSi
146148

147149
public void CtorPhase2()
148150
{
149-
UnmangledName = UnmangleMethodName();
150-
UnmangledNameWithSignature = UnmangleMethodNameWithSignature();
151+
// Make context manually, NewMethod.DeclaringType is null for now
152+
var genericContext = new GenericParameterContext(DeclaringType.NewType, NewMethod);
153+
154+
UnmangledName = UnmangleMethodName(genericContext);
155+
UnmangledNameWithSignature = UnmangleMethodNameWithSignature(genericContext);
151156

152157
NewMethod.Name = UnmangledName;
153-
NewMethod.Signature!.ReturnType = DeclaringType.AssemblyContext.RewriteTypeRef(OriginalMethod.Signature?.ReturnType, OriginalMethod.GetGenericParameterContext(), DeclaringType.isBoxedTypeVariant);
158+
NewMethod.Signature!.ReturnType = DeclaringType.AssemblyContext.RewriteTypeRef(OriginalMethod.Signature?.ReturnType, genericContext, DeclaringType.isBoxedTypeVariant);
154159

155160
var nonGenericMethodInfoPointerField = new FieldDefinition(
156161
"NativeMethodInfoPtr_" + UnmangledNameWithSignature,
@@ -227,7 +232,7 @@ private MethodAttributes AdjustAttributes(MethodAttributes original, bool stripV
227232
return original;
228233
}
229234

230-
private string UnmangleMethodName()
235+
private string UnmangleMethodName(GenericParameterContext context)
231236
{
232237
var method = OriginalMethod;
233238

@@ -241,12 +246,12 @@ private string UnmangleMethodName()
241246
return ".ctor";
242247

243248
if (method.Name.IsObfuscated(DeclaringType.AssemblyContext.GlobalContext.Options))
244-
return UnmangleMethodNameWithSignature();
249+
return UnmangleMethodNameWithSignature(context);
245250

246251
return method.Name.MakeValidInSource();
247252
}
248253

249-
private string ProduceMethodSignatureBase()
254+
private string ProduceMethodSignatureBase(GenericParameterContext context)
250255
{
251256
var method = OriginalMethod;
252257

@@ -274,12 +279,12 @@ private string ProduceMethodSignatureBase()
274279
builder.Append(str);
275280

276281
builder.Append('_');
277-
builder.Append(DeclaringType.AssemblyContext.RewriteTypeRef(method.Signature?.ReturnType, method.GetGenericParameterContext(), DeclaringType.isBoxedTypeVariant).GetUnmangledName(method.DeclaringType, method));
282+
builder.Append(DeclaringType.AssemblyContext.RewriteTypeRef(method.Signature?.ReturnType, context, DeclaringType.isBoxedTypeVariant).GetUnmangledName(method.DeclaringType, method));
278283

279284
foreach (var param in method.Parameters)
280285
{
281286
builder.Append('_');
282-
builder.Append(DeclaringType.AssemblyContext.RewriteTypeRef(param.ParameterType, method.GetGenericParameterContext(), DeclaringType.isBoxedTypeVariant).GetUnmangledName(method.DeclaringType, method));
287+
builder.Append(DeclaringType.AssemblyContext.RewriteTypeRef(param.ParameterType, context, DeclaringType.isBoxedTypeVariant).GetUnmangledName(method.DeclaringType, method));
283288
}
284289

285290
var address = Rva;
@@ -290,9 +295,9 @@ private string ProduceMethodSignatureBase()
290295
}
291296

292297

293-
private string UnmangleMethodNameWithSignature()
298+
private string UnmangleMethodNameWithSignature(GenericParameterContext context)
294299
{
295-
var unmangleMethodNameWithSignature = ProduceMethodSignatureBase() + "_" + DeclaringType.Methods
300+
var unmangleMethodNameWithSignature = ProduceMethodSignatureBase(context) + "_" + DeclaringType.Methods
296301
.Where(ParameterSignatureMatchesThis).TakeWhile(it => it != this).Count();
297302

298303
if (DeclaringType.AssemblyContext.GlobalContext.Options.RenameMap.TryGetValue(

Il2CppInterop.Generator/Passes/Pass19CopyMethodParameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void DoPass(RewriteGlobalContext context)
2424
: originalMethodParameter.Name;
2525

2626
var newParameter = newMethod.AddParameter(
27-
assemblyContext.RewriteTypeRef(originalMethodParameter.ParameterType, originalMethod.GetGenericParameterContext(), typeContext.isBoxedTypeVariant),
27+
assemblyContext.RewriteTypeRef(originalMethodParameter.ParameterType, newMethod.GetGenericParameterContext(), typeContext.isBoxedTypeVariant),
2828
newName,
2929
originalMethodParameter.GetOrCreateDefinition().Attributes & ~ParameterAttributes.HasFieldMarshal);
3030

Il2CppInterop.Generator/Passes/Pass21GenerateValueTypeFields.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static void DoPass(RewriteGlobalContext context)
5858
if (!field.Signature!.FieldType.IsValueType && field.Signature.FieldType is not PointerTypeSignature and not GenericParameterSignature)
5959
rewriteTypeRef = assemblyContext.Imports.Module.IntPtr();
6060
else
61-
rewriteTypeRef = assemblyContext.RewriteTypeRef(field.Signature.FieldType, field.DeclaringType!.GetGenericParameterContext());
61+
rewriteTypeRef = assemblyContext.RewriteTypeRef(field.Signature.FieldType, newType.GetGenericParameterContext());
6262

6363
var newField = new FieldDefinition(fieldContext.UnmangledName, field.Attributes.ForcePublic(), rewriteTypeRef);
6464

Il2CppInterop.Generator/Passes/Pass22GenerateEnums.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static void DoPass(RewriteGlobalContext context)
4444
fieldName = newName;
4545

4646
var newDef = new FieldDefinition(fieldName, fieldDefinition.Attributes | FieldAttributes.HasDefault,
47-
assemblyContext.RewriteTypeRef(fieldDefinition.Signature!.FieldType, type.GetGenericParameterContext()));
47+
assemblyContext.RewriteTypeRef(fieldDefinition.Signature!.FieldType, newType.GetGenericParameterContext()));
4848
newType.Fields.Add(newDef);
4949

5050
newDef.Constant = fieldDefinition.Constant;

Il2CppInterop.Generator/Passes/Pass40GenerateFieldAccessors.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static void DoPass(RewriteGlobalContext context)
2323
var field = fieldContext.OriginalField;
2424
var unmangleFieldName = fieldContext.UnmangledName;
2525

26-
var propertyType = assemblyContext.RewriteTypeRef(field.Signature!.FieldType, field.DeclaringType!.GetGenericParameterContext(), typeContext.isBoxedTypeVariant);
26+
var propertyType = assemblyContext.RewriteTypeRef(field.Signature!.FieldType, typeContext.NewType!.GetGenericParameterContext(), typeContext.isBoxedTypeVariant);
2727
var signature = field.IsStatic
2828
? PropertySignature.CreateStatic(propertyType)
2929
: PropertySignature.CreateInstance(propertyType);

Il2CppInterop.Generator/Passes/Pass70GenerateProperties.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ public static void DoPass(RewriteGlobalContext context)
2525
var unmangledPropertyName = UnmanglePropertyName(assemblyContext, oldProperty, typeContext.NewType,
2626
propertyCountsByName);
2727

28-
var propertyType = assemblyContext.RewriteTypeRef(oldProperty.Signature!.ReturnType, type.GetGenericParameterContext(), typeContext.isBoxedTypeVariant);
28+
var propertyType = assemblyContext.RewriteTypeRef(oldProperty.Signature!.ReturnType, typeContext.NewType.GetGenericParameterContext(), typeContext.isBoxedTypeVariant);
2929
var signature = oldProperty.Signature.HasThis
3030
? PropertySignature.CreateInstance(propertyType)
3131
: PropertySignature.CreateStatic(propertyType);
3232
foreach (var oldParameter in oldProperty.Signature.ParameterTypes)
33-
signature.ParameterTypes.Add(assemblyContext.RewriteTypeRef(oldParameter, type.GetGenericParameterContext(), typeContext.isBoxedTypeVariant));
33+
signature.ParameterTypes.Add(assemblyContext.RewriteTypeRef(oldParameter, typeContext.NewType.GetGenericParameterContext(), typeContext.isBoxedTypeVariant));
3434

3535
var property = new PropertyDefinition(unmangledPropertyName, oldProperty.Attributes, signature);
3636

@@ -77,12 +77,12 @@ static bool IsDefaultMemberAttributeReal(CustomAttribute attribute)
7777
}
7878

7979
private static string UnmanglePropertyName(AssemblyRewriteContext assemblyContext, PropertyDefinition prop,
80-
ITypeDefOrRef declaringType, Dictionary<string, int> countsByBaseName)
80+
TypeDefinition declaringType, Dictionary<string, int> countsByBaseName)
8181
{
8282
if (assemblyContext.GlobalContext.Options.PassthroughNames ||
8383
!prop.Name.IsObfuscated(assemblyContext.GlobalContext.Options)) return prop.Name!;
8484

85-
var baseName = "prop_" + assemblyContext.RewriteTypeRef(prop.Signature!.ReturnType, prop.DeclaringType!.GetGenericParameterContext()).GetUnmangledName(prop.DeclaringType);
85+
var baseName = "prop_" + assemblyContext.RewriteTypeRef(prop.Signature!.ReturnType, declaringType.GetGenericParameterContext()).GetUnmangledName(prop.DeclaringType);
8686

8787
countsByBaseName.TryGetValue(baseName, out var index);
8888
countsByBaseName[baseName] = index + 1;

0 commit comments

Comments
 (0)