Skip to content

Commit

Permalink
Don't unbox non-blittable generic valuetypes for parameter loading (#69)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kasuromi authored Apr 1, 2023
1 parent 41dc00b commit 18e58ef
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 8 deletions.
4 changes: 2 additions & 2 deletions Il2CppInterop.Generator/Extensions/ILGeneratorEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ private static void EmitObjectStoreGeneric(ILProcessor body, TypeReference origi

public static void EmitObjectToPointer(this ILProcessor body, TypeReference originalType, TypeReference newType,
TypeRewriteContext enclosingType, int argumentIndex, bool valueTypeArgument0IsAPointer, bool allowNullable,
bool unboxNonBlittableType, out VariableDefinition? refVariable)
bool unboxNonBlittableType, bool unboxNonBlittableGeneric, out VariableDefinition? refVariable)
{
// input stack: not used
// output stack: IntPtr to either Il2CppObject or IL2CPP value type
Expand All @@ -167,7 +167,7 @@ public static void EmitObjectToPointer(this ILProcessor body, TypeReference orig
if (originalType is GenericParameter)
{
EmitObjectToPointerGeneric(body, originalType, newType, enclosingType, argumentIndex,
valueTypeArgument0IsAPointer, allowNullable, unboxNonBlittableType);
valueTypeArgument0IsAPointer, allowNullable, unboxNonBlittableGeneric);
return;
}

Expand Down
4 changes: 2 additions & 2 deletions Il2CppInterop.Generator/Passes/Pass50GenerateMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ public static void DoPass(RewriteGlobalContext context)
else
{
bodyBuilder.EmitObjectToPointer(originalMethod.Parameters[i].ParameterType, newParam.ParameterType,
methodRewriteContext.DeclaringType, argOffset + i, false, true, true, out var refVar);
methodRewriteContext.DeclaringType, argOffset + i, false, true, true, false, out var refVar);
if (refVar != null)
byRefParams.Add((i, refVar));
}
Expand Down Expand Up @@ -203,7 +203,7 @@ public static void DoPass(RewriteGlobalContext context)
bodyBuilder.Emit(OpCodes.Ldc_I4_0);
else
bodyBuilder.EmitObjectToPointer(originalMethod.DeclaringType, newMethod.DeclaringType, typeContext, 0,
true, false, true, out _);
true, false, true, true, out _);

bodyBuilder.Emit(OpCodes.Ldloc, argArray);
bodyBuilder.Emit(OpCodes.Ldloca, exceptionLocal);
Expand Down
6 changes: 3 additions & 3 deletions Il2CppInterop.Generator/Utils/FieldAccessorGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public static void MakeGetter(FieldDefinition field, FieldRewriteContext fieldCo
getter.Body.Variables.Add(local0);

getterBody.EmitObjectToPointer(fieldContext.DeclaringType.OriginalType, fieldContext.DeclaringType.NewType,
fieldContext.DeclaringType, 0, false, false, false, out _);
fieldContext.DeclaringType, 0, false, false, false, false, out _);
getterBody.Emit(OpCodes.Ldsfld, fieldContext.PointerField);
getterBody.Emit(OpCodes.Call, imports.IL2CPP_il2cpp_field_get_offset.Value);
getterBody.Emit(OpCodes.Add);
Expand Down Expand Up @@ -94,13 +94,13 @@ public static void MakeSetter(FieldDefinition field, FieldRewriteContext fieldCo
{
setterBody.Emit(OpCodes.Ldsfld, fieldContext.PointerField);
setterBody.EmitObjectToPointer(field.FieldType, property.PropertyType, fieldContext.DeclaringType, 0, false,
true, true, out _);
true, true, true, out _);
setterBody.Emit(OpCodes.Call, imports.IL2CPP_il2cpp_field_static_set_value.Value);
}
else
{
setterBody.EmitObjectToPointer(fieldContext.DeclaringType.OriginalType, fieldContext.DeclaringType.NewType,
fieldContext.DeclaringType, 0, false, false, false, out _);
fieldContext.DeclaringType, 0, false, false, false, false, out _);
setterBody.Emit(OpCodes.Dup);
setterBody.Emit(OpCodes.Ldsfld, fieldContext.PointerField);
setterBody.Emit(OpCodes.Call, imports.IL2CPP_il2cpp_field_get_offset.Value);
Expand Down
2 changes: 1 addition & 1 deletion Il2CppInterop.Generator/Utils/UnstripGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public static void GenerateInvokerMethodBody(MethodDefinition newMethod, FieldDe
else
{
body.EmitObjectToPointer(param.ParameterType, param.ParameterType, enclosingType, i + argOffset, false,
true, true, out var refVar);
true, true, true, out var refVar);
if (refVar != null)
{
Logger.Instance.LogTrace("Method {NewMethod} has a reference-typed ref parameter, this will be ignored",
Expand Down

0 comments on commit 18e58ef

Please sign in to comment.