Skip to content

Commit

Permalink
Fix invoker/trampoline for static methods with parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
js6pak authored and limoka committed Jan 16, 2025
1 parent 45c1598 commit b13fc2c
Showing 1 changed file with 20 additions and 15 deletions.
35 changes: 20 additions & 15 deletions Il2CppInterop.Runtime/Injection/ClassInjector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -818,6 +818,16 @@ private static Delegate GetOrCreateTrampoline(MethodInfo monoMethod)
return CreateTrampoline(monoMethod);
}

private static Type[] GetNativeParameterTypes(MethodInfo monoMethod)
{
var nativeParameterTypes = new List<Type>();
if (!monoMethod.IsStatic)
nativeParameterTypes.Add(typeof(IntPtr));
nativeParameterTypes.AddRange(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()));
nativeParameterTypes.Add(typeof(Il2CppMethodInfo*));
return nativeParameterTypes.ToArray();
}

private static Delegate CreateInvoker(MethodInfo monoMethod)
{
DynamicMethod method;
Expand All @@ -841,11 +851,11 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
var body = method.GetILGenerator();

if (!monoMethod.IsStatic)
body.Emit(OpCodes.Ldarg_2);
body.Emit(OpCodes.Ldarg_2); // obj
for (var i = 0; i < monoMethod.GetParameters().Length; i++)
{
var parameterInfo = monoMethod.GetParameters()[i];
body.Emit(OpCodes.Ldarg_3);
body.Emit(OpCodes.Ldarg_3); // args
body.Emit(OpCodes.Ldc_I4, i * IntPtr.Size);
body.Emit(OpCodes.Add_Ovf_Un);
var nativeType = parameterInfo.ParameterType.NativeType();
Expand All @@ -854,10 +864,9 @@ private static Delegate CreateInvoker(MethodInfo monoMethod)
body.Emit(OpCodes.Ldobj, nativeType);
}

body.Emit(OpCodes.Ldarg_0);
body.EmitCalli(OpCodes.Calli, CallingConvention.Cdecl, monoMethod.ReturnType.NativeType(),
new[] { typeof(IntPtr) }.Concat(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()))
.ToArray());
body.Emit(OpCodes.Ldarg_1); // methodMetadata
body.Emit(OpCodes.Ldarg_0); // methodPointer
body.EmitCalli(OpCodes.Calli, CallingConvention.Cdecl, monoMethod.ReturnType.NativeType(), GetNativeParameterTypes(monoMethod));

if (UnityVersionHandler.IsMetadataV29OrHigher)
{
Expand Down Expand Up @@ -923,12 +932,6 @@ private static void StaticVoidIntPtrInvoker_MetadataV29(IntPtr methodPointer, Il

private static Delegate CreateTrampoline(MethodInfo monoMethod)
{
var nativeParameterTypes = new List<Type>();
if (!monoMethod.IsStatic)
nativeParameterTypes.Add(typeof(IntPtr));
nativeParameterTypes.AddRange(monoMethod.GetParameters().Select(it => it.ParameterType.NativeType()));
nativeParameterTypes.Add(typeof(Il2CppMethodInfo*));

var managedParameters = new List<Type>();
if (!monoMethod.IsStatic)
managedParameters.Add(monoMethod.DeclaringType);
Expand All @@ -937,7 +940,7 @@ private static Delegate CreateTrampoline(MethodInfo monoMethod)
var method = new DynamicMethod(
"Trampoline_" + ExtractSignature(monoMethod) + monoMethod.DeclaringType + monoMethod.Name,
MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard,
monoMethod.ReturnType.NativeType(), nativeParameterTypes.ToArray(),
monoMethod.ReturnType.NativeType(), GetNativeParameterTypes(monoMethod),
monoMethod.DeclaringType, true);

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

var indirectVariables = new LocalBuilder[managedParameters.Count];

for (var i = 1; i < managedParameters.Count; i++)
var argOffset = method.IsStatic ? 0 : 1;

for (var i = argOffset; i < managedParameters.Count; i++)
{
var parameter = managedParameters[i];
if (parameter.IsSubclassOf(typeof(ValueType)))
Expand Down Expand Up @@ -1027,7 +1032,7 @@ void HandleTypeConversion(Type type)
body.Emit(OpCodes.Stloc, managedReturnVariable);
}

for (var i = 1; i < managedParameters.Count; i++)
for (var i = argOffset; i < managedParameters.Count; i++)
{
var variable = indirectVariables[i];
if (variable == null)
Expand Down

0 comments on commit b13fc2c

Please sign in to comment.