Skip to content

Commit 6eeeb3c

Browse files
committed
Fix invoker/trampoline for static methods with parameters
1 parent 560ce9f commit 6eeeb3c

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
@@ -819,6 +819,16 @@ private static Delegate GetOrCreateTrampoline(MethodInfo monoMethod)
819819
return CreateTrampoline(monoMethod);
820820
}
821821

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

844854
if (!monoMethod.IsStatic)
845-
body.Emit(OpCodes.Ldarg_2);
855+
body.Emit(OpCodes.Ldarg_2); // obj
846856
for (var i = 0; i < monoMethod.GetParameters().Length; i++)
847857
{
848858
var parameterInfo = monoMethod.GetParameters()[i];
849-
body.Emit(OpCodes.Ldarg_3);
859+
body.Emit(OpCodes.Ldarg_3); // args
850860
body.Emit(OpCodes.Ldc_I4, i * IntPtr.Size);
851861
body.Emit(OpCodes.Add_Ovf_Un);
852862
var nativeType = parameterInfo.ParameterType.NativeType();
@@ -855,10 +865,9 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
855865
body.Emit(OpCodes.Ldobj, nativeType);
856866
}
857867

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

863872
if (UnityVersionHandler.IsMetadataV29OrHigher)
864873
{
@@ -924,12 +933,6 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il
924933

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

944947
var signature = new DelegateSupport.MethodSignature(monoMethod, !monoMethod.IsStatic);
@@ -958,7 +961,9 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
958961

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

961-
for (var i = 1; i < managedParameters.Count; i++)
964+
var argOffset = method.IsStatic ? 0 : 1;
965+
966+
for (var i = argOffset; i < managedParameters.Count; i++)
962967
{
963968
var parameter = managedParameters[i];
964969
if (parameter.IsSubclassOf(typeof(ValueType)))
@@ -1028,7 +1033,7 @@ void HandleTypeConversion(Type type)
10281033
body.Emit(OpCodes.Stloc, managedReturnVariable);
10291034
}
10301035

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

0 commit comments

Comments
 (0)