Skip to content

Commit

Permalink
Improve property resolution during unstripping (#169)
Browse files Browse the repository at this point in the history
  • Loading branch information
ds5678 authored Sep 14, 2024
1 parent 23b74e1 commit 2f73813
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
5 changes: 5 additions & 0 deletions Il2CppInterop.Generator/Contexts/RewriteGlobalContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,11 @@ public AssemblyRewriteContext GetAssemblyByName(string name)
return null;
}

public TypeRewriteContext GetContextForNewType(TypeDefinition type)
{
return GetAssemblyByName(type.Module!.Assembly!.Name!).GetContextForNewType(type);
}

public MethodDefinition? CreateParamsMethod(MethodDefinition originalMethod, MethodDefinition newMethod,
RuntimeAssemblyReferences imports, Func<TypeSignature, TypeSignature?> resolve)
{
Expand Down
17 changes: 13 additions & 4 deletions Il2CppInterop.Generator/Utils/UnstripTranslator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,18 +110,27 @@ public static bool TranslateMethod(MethodDefinition original, MethodDefinition t
var fieldDeclarerDefinition = fieldDeclarer.Resolve();
if (fieldDeclarerDefinition == null)
return false;
var newField = fieldDeclarerDefinition.Fields.SingleOrDefault(it => it.Name == fieldArg.Name);

var fieldDeclarerContext = globalContext.GetContextForNewType(fieldDeclarerDefinition);
var propertyName = fieldDeclarerContext.Fields.SingleOrDefault(it => it.OriginalField.Name == fieldArg.Name)?.UnmangledName;

var newField = fieldDeclarerDefinition.Fields.SingleOrDefault(it => it.Name == fieldArg.Name)
?? fieldDeclarerDefinition.Fields.SingleOrDefault(it => it.Name == propertyName);
if (newField != null)
{
var newInstruction = targetBuilder.Add(bodyInstruction.OpCode, imports.Module.DefaultImporter.ImportField(newField));
instructionMap.Add(bodyInstruction, newInstruction);
}
else
{
if (bodyInstruction.OpCode == OpCodes.Ldfld || bodyInstruction.OpCode == OpCodes.Ldsfld)
if (propertyName == null)
{
return false;
}
else if (bodyInstruction.OpCode == OpCodes.Ldfld || bodyInstruction.OpCode == OpCodes.Ldsfld)
{
var getterMethod = fieldDeclarerDefinition.Properties
.SingleOrDefault(it => it.Name == fieldArg.Name)?.GetMethod;
.SingleOrDefault(it => it.Name == propertyName)?.GetMethod;
if (getterMethod == null)
return false;

Expand All @@ -131,7 +140,7 @@ public static bool TranslateMethod(MethodDefinition original, MethodDefinition t
else if (bodyInstruction.OpCode == OpCodes.Stfld || bodyInstruction.OpCode == OpCodes.Stsfld)
{
var setterMethod = fieldDeclarerDefinition.Properties
.SingleOrDefault(it => it.Name == fieldArg.Name)?.SetMethod;
.SingleOrDefault(it => it.Name == propertyName)?.SetMethod;
if (setterMethod == null)
return false;

Expand Down

0 comments on commit 2f73813

Please sign in to comment.