From 5e58d9e1b4b45f85470ffb596e15b233fcaa3823 Mon Sep 17 00:00:00 2001 From: ds5678 <49847914+ds5678@users.noreply.github.com> Date: Sun, 30 Jun 2024 22:44:39 -0700 Subject: [PATCH] Unstrip ldlen --- .../Utils/RuntimeAssemblyReferences.cs | 18 +++++++++++++++--- .../Utils/UnstripTranslator.cs | 13 ++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Il2CppInterop.Generator/Utils/RuntimeAssemblyReferences.cs b/Il2CppInterop.Generator/Utils/RuntimeAssemblyReferences.cs index 69a28748..ec410908 100644 --- a/Il2CppInterop.Generator/Utils/RuntimeAssemblyReferences.cs +++ b/Il2CppInterop.Generator/Utils/RuntimeAssemblyReferences.cs @@ -21,7 +21,7 @@ public RuntimeAssemblyReferences(ModuleDefinition module, RewriteGlobalContext g InitMethodRefs(); } - public ModuleDefinition Module { get; } + public ModuleDefinition Module { get; } #nullable disable public Memoize Il2CppRefrenceArrayctor { get; private set; } public Lazy Il2CppStringArrayctor { get; private set; } @@ -29,6 +29,7 @@ public RuntimeAssemblyReferences(ModuleDefinition module, RewriteGlobalContext g public Memoize Il2CppRefrenceArrayctor_size { get; private set; } public Lazy Il2CppStringArrayctor_size { get; private set; } public Memoize Il2CppStructArrayctor_size { get; private set; } + public Lazy Il2CppArrayBase_get_Length { get; private set; } public Lazy IL2CPP_Il2CppObjectBaseToPtr { get; private set; } public Lazy IL2CPP_Il2CppObjectBaseToPtrNotNull { get; private set; } public Lazy IL2CPP_Il2CppStringToManaged { get; private set; } @@ -69,7 +70,7 @@ public RuntimeAssemblyReferences(ModuleDefinition module, RewriteGlobalContext g public Lazy CachedScanResultsAttributector { get; private set; } public Lazy Il2CppSystemDelegateCombine { get; private set; } public Lazy Il2CppSystemDelegateRemove { get; private set; } - public Lazy Il2CppSystemRuntimeTypeHandleGetRuntimeTypeHandle { get; private set; } + public Lazy Il2CppSystemRuntimeTypeHandleGetRuntimeTypeHandle { get; private set; } public IMethodDescriptor WriteFieldWBarrier => globalCtx.HasGcWbarrierFieldWrite ? IL2CPP_il2cpp_gc_wbarrier_set_field.Value @@ -85,7 +86,7 @@ public RuntimeAssemblyReferences(ModuleDefinition module, RewriteGlobalContext g public TypeSignature Il2Cpp { get; set; } public TypeSignature RuntimeReflectionHelper { get; private set; } public TypeSignature DelegateSupport { get; private set; } - public TypeSignature Il2CppException { get; private set; } + public TypeSignature Il2CppException { get; private set; } #nullable enable private TypeSignature ResolveType(string typeName) { @@ -119,6 +120,8 @@ private void InitTypeRefs() Il2CppArrayBase = new TypeReference(Module, assemblyRef, "Il2CppInterop.Runtime.InteropTypes.Arrays", "Il2CppArrayBase`1").ToTypeSignature(); + var nonGenericIl2CppArrayBase = new TypeReference(Module, assemblyRef, "Il2CppInterop.Runtime.InteropTypes.Arrays", "Il2CppArrayBase").ToTypeSignature(); + Il2CppStructArray = new TypeReference(Module, assemblyRef, "Il2CppInterop.Runtime.InteropTypes.Arrays", "Il2CppStructArray`1").ToTypeSignature(); Il2CppReferenceArray = new TypeReference(Module, assemblyRef, "Il2CppInterop.Runtime.InteropTypes.Arrays", "Il2CppReferenceArray`1").ToTypeSignature(); @@ -136,6 +139,7 @@ private void InitTypeRefs() allTypes["Il2CppInterop.Runtime.InteropTypes.Il2CppObjectBase"] = Il2CppObjectBase; allTypes["Il2CppInterop.Runtime.Runtime.Il2CppObjectPool"] = Il2CppObjectPool; + allTypes["Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppArrayBase"] = nonGenericIl2CppArrayBase; allTypes["Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStringArray"] = Il2CppStringArray; allTypes["Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray"] = Il2CppReferenceArray; allTypes["Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStructArray"] = Il2CppStructArray; @@ -199,6 +203,14 @@ private void InitMethodRefs() return mr; }); + Il2CppArrayBase_get_Length = new Lazy(() => + { + var owner = ResolveType("Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppArrayBase"); + var mr = ReferenceCreator.CreateInstanceMethodReference("get_Length", ResolveType("System.Int32"), + owner.ToTypeDefOrRef()); + return mr; + }); + IL2CPP_Il2CppObjectBaseToPtr = new Lazy(() => { var mr = ReferenceCreator.CreateStaticMethodReference("Il2CppObjectBaseToPtr", ResolveType("System.IntPtr"), diff --git a/Il2CppInterop.Generator/Utils/UnstripTranslator.cs b/Il2CppInterop.Generator/Utils/UnstripTranslator.cs index d6404a05..dbaefbae 100644 --- a/Il2CppInterop.Generator/Utils/UnstripTranslator.cs +++ b/Il2CppInterop.Generator/Utils/UnstripTranslator.cs @@ -42,11 +42,14 @@ public static bool TranslateMethod(MethodDefinition original, MethodDefinition t { if (bodyInstruction.Operand is null) { + CilInstruction newInstruction; switch (bodyInstruction.OpCode.Code) { case CilCode.Ldlen: //This is Il2CppArrayBase.Length - return false; + newInstruction = targetBuilder.Add(OpCodes.Callvirt, + imports.Module.DefaultImporter.ImportMethod(imports.Il2CppArrayBase_get_Length.Value)); + break; case CilCode.Ldelema: //This is Il2CppArrayBase.Pointer + index * sizeof(T) but the T is not known because the operand is null. @@ -78,14 +81,18 @@ public static bool TranslateMethod(MethodDefinition original, MethodDefinition t case >= CilCode.Ldind_I1 and <= CilCode.Ldind_Ref: //This is for by ref parameters - break; + goto default; case >= CilCode.Stind_Ref and <= CilCode.Stind_R8: //This is for by ref parameters + goto default; + + default: + //Noop, ldnull, ldarg_0, mul, add, etc. + newInstruction = targetBuilder.Add(bodyInstruction.OpCode); break; } - var newInstruction = targetBuilder.Add(bodyInstruction.OpCode); instructionMap.Add(bodyInstruction, newInstruction); } else if (bodyInstruction.OpCode.OperandType == CilOperandType.InlineField)