Skip to content

Commit b13fc2c

Browse files
js6paklimoka
authored andcommitted
Fix invoker/trampoline for static methods with parameters
1 parent 45c1598 commit b13fc2c

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

Il2CppInterop.Runtime/Injection/ClassInjector.cs

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,16 @@ private static Delegate GetOrCreateTrampoline(MethodInfo monoMethod)
818818
return CreateTrampoline(monoMethod);
819819
}
820820

821+
private static Type[] GetNativeParameterTypes(MethodInfo monoMethod)
822+
{
823+
var nativeParameterTypes = new List<Type>();
824+
if (!monoMethod.IsStatic)
825+
nativeParameterTypes.Add(typeof(IntPtr));
826+
nativeParameterTypes.AddRange(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()));
827+
nativeParameterTypes.Add(typeof(Il2CppMethodInfo*));
828+
return nativeParameterTypes.ToArray();
829+
}
830+
821831
private static Delegate CreateInvoker(MethodInfo monoMethod)
822832
{
823833
DynamicMethod method;
@@ -841,11 +851,11 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
841851
var body = method.GetILGenerator();
842852

843853
if (!monoMethod.IsStatic)
844-
body.Emit(OpCodes.Ldarg_2);
854+
body.Emit(OpCodes.Ldarg_2); // obj
845855
for (var i = 0; i < monoMethod.GetParameters().Length; i++)
846856
{
847857
var parameterInfo = monoMethod.GetParameters()[i];
848-
body.Emit(OpCodes.Ldarg_3);
858+
body.Emit(OpCodes.Ldarg_3); // args
849859
body.Emit(OpCodes.Ldc_I4, i * IntPtr.Size);
850860
body.Emit(OpCodes.Add_Ovf_Un);
851861
var nativeType = parameterInfo.ParameterType.NativeType();
@@ -854,10 +864,9 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
854864
body.Emit(OpCodes.Ldobj, nativeType);
855865
}
856866

857-
body.Emit(OpCodes.Ldarg_0);
858-
body.EmitCalli(OpCodes.Calli, CallingConvention.Cdecl, monoMethod.ReturnType.NativeType(),
859-
new[] { typeof(IntPtr) }.Concat(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()))
860-
.ToArray());
867+
body.Emit(OpCodes.Ldarg_1); // methodMetadata
868+
body.Emit(OpCodes.Ldarg_0); // methodPointer
869+
body.EmitCalli(OpCodes.Calli, CallingConvention.Cdecl, monoMethod.ReturnType.NativeType(), GetNativeParameterTypes(monoMethod));
861870

862871
if (UnityVersionHandler.IsMetadataV29OrHigher)
863872
{
@@ -923,12 +932,6 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il
923932

924933
private static Delegate CreateTrampoline(MethodInfo monoMethod)
925934
{
926-
var nativeParameterTypes = new List<Type>();
927-
if (!monoMethod.IsStatic)
928-
nativeParameterTypes.Add(typeof(IntPtr));
929-
nativeParameterTypes.AddRange(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()));
930-
nativeParameterTypes.Add(typeof(Il2CppMethodInfo*));
931-
932935
var managedParameters = new List<Type>();
933936
if (!monoMethod.IsStatic)
934937
managedParameters.Add(monoMethod.DeclaringType);
@@ -937,7 +940,7 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
937940
var method = new DynamicMethod(
938941
"Trampoline_" + ExtractSignature(monoMethod) + monoMethod.DeclaringType + monoMethod.Name,
939942
MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard,
940-
monoMethod.ReturnType.NativeType(), nativeParameterTypes.ToArray(),
943+
monoMethod.ReturnType.NativeType(), GetNativeParameterTypes(monoMethod),
941944
monoMethod.DeclaringType, true);
942945

943946
var signature = new DelegateSupport.MethodSignature(monoMethod, !monoMethod.IsStatic);
@@ -957,7 +960,9 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
957960

958961
var indirectVariables = new LocalBuilder[managedParameters.Count];
959962

960-
for (var i = 1; i < managedParameters.Count; i++)
963+
var argOffset = method.IsStatic ? 0 : 1;
964+
965+
for (var i = argOffset; i < managedParameters.Count; i++)
961966
{
962967
var parameter = managedParameters[i];
963968
if (parameter.IsSubclassOf(typeof(ValueType)))
@@ -1027,7 +1032,7 @@ void HandleTypeConversion(Type type)
10271032
body.Emit(OpCodes.Stloc, managedReturnVariable);
10281033
}
10291034

1030-
for (var i = 1; i < managedParameters.Count; i++)
1035+
for (var i = argOffset; i < managedParameters.Count; i++)
10311036
{
10321037
var variable = indirectVariables[i];
10331038
if (variable == null)

0 commit comments

Comments
 (0)