Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions Il2CppInterop.Generator/Extensions/ILGeneratorEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ private static void EmitObjectStoreGeneric(ILProcessor body, TypeSignature origi

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

Expand Down Expand Up @@ -262,6 +262,12 @@ private static void EmitObjectToPointerGeneric(ILProcessor body, TypeSignature o
body.Add(OpCodes.Call, imports.IL2CPP_il2cpp_object_get_class.Value);
body.Add(OpCodes.Call, imports.IL2CPP_il2cpp_class_is_valuetype.Value);
body.Add(OpCodes.Brfalse_S, finalNop); // return reference types immediately
body.Add(OpCodes.Ldtoken, imports.Il2CppSystemValueType.ToTypeDefOrRef());
body.Add(OpCodes.Call, enclosingType.NewType.Module!.TypeGetTypeFromHandle());
body.Add(OpCodes.Ldtoken, newType.ToTypeDefOrRef());
body.Add(OpCodes.Call, enclosingType.NewType.Module!.TypeGetTypeFromHandle());
body.Add(OpCodes.Call, enclosingType.NewType.Module!.TypeGetIsAssignableFrom());
body.Add(OpCodes.Brfalse_S, finalNop); // return reference types immediately
body.Add(OpCodes.Call, imports.IL2CPP_il2cpp_object_unbox.Value);
}

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 @@ -169,7 +169,7 @@ _ when originalElementType.IsValueType() => imports.Il2CppStructArrayctor_size.G
else
{
bodyBuilder.EmitObjectToPointer(originalMethod.Parameters[i].ParameterType, newParam.ParameterType,
methodRewriteContext.DeclaringType, argOffset + i, false, true, true, false, out var refVar);
methodRewriteContext.DeclaringType, argOffset + i, false, true, true, out var refVar);
if (refVar != null)
byRefParams.Add((i, refVar));
}
Expand Down Expand Up @@ -205,7 +205,7 @@ _ when originalElementType.IsValueType() => imports.Il2CppStructArrayctor_size.G
bodyBuilder.Add(OpCodes.Ldc_I4_0);
else
bodyBuilder.EmitObjectToPointer(originalMethod.DeclaringType.ToTypeSignature(), newMethod.DeclaringType!.ToTypeSignature(), typeContext, 0,
true, false, true, true, out _);
true, false, true, out _);

bodyBuilder.Add(OpCodes.Ldloc, argArray);
bodyBuilder.Add(OpCodes.Ldloca, exceptionLocal);
Expand Down
7 changes: 7 additions & 0 deletions Il2CppInterop.Generator/Utils/CorlibReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,13 @@ public static MemberReference TypeGetTypeFromHandle(this ModuleDefinition module
return new MemberReference(type.ToTypeDefOrRef(), nameof(System.Type.GetTypeFromHandle), signature);
}

public static MemberReference TypeGetIsAssignableFrom(this ModuleDefinition module)
{
var type = module.Type();
MethodSignature signature = MethodSignature.CreateInstance(module.Bool(), module.Type());
return new MemberReference(type.ToTypeDefOrRef(), nameof(System.Type.IsAssignableFrom), signature);
}

public static MemberReference TypeGetIsValueType(this ModuleDefinition module)
{
var type = module.Type();
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 @@ -68,7 +68,7 @@ public static void MakeGetter(FieldDefinition field, FieldRewriteContext fieldCo
getter.CilMethodBody.LocalVariables.Add(local0);

getterBody.EmitObjectToPointer(fieldContext.DeclaringType.OriginalType.ToTypeSignature(), fieldContext.DeclaringType.NewType.ToTypeSignature(),
fieldContext.DeclaringType, 0, false, false, false, false, out _);
fieldContext.DeclaringType, 0, false, false, false, out _);
getterBody.Add(OpCodes.Ldsfld, fieldContext.PointerField);
getterBody.Add(OpCodes.Call, imports.IL2CPP_il2cpp_field_get_offset.Value);
getterBody.Add(OpCodes.Add);
Expand Down Expand Up @@ -102,13 +102,13 @@ public static void MakeSetter(FieldDefinition field, FieldRewriteContext fieldCo
{
setterBody.Add(OpCodes.Ldsfld, fieldContext.PointerField);
setterBody.EmitObjectToPointer(field.Signature!.FieldType, property.Signature.ReturnType, fieldContext.DeclaringType, 0, false,
true, true, true, out _);
true, true, out _);
setterBody.Add(OpCodes.Call, imports.IL2CPP_il2cpp_field_static_set_value.Value);
}
else
{
setterBody.EmitObjectToPointer(fieldContext.DeclaringType.OriginalType.ToTypeSignature(), fieldContext.DeclaringType.NewType.ToTypeSignature(),
fieldContext.DeclaringType, 0, false, false, false, false, out _);
fieldContext.DeclaringType, 0, false, false, false, out _);
setterBody.Add(OpCodes.Dup);
setterBody.Add(OpCodes.Ldsfld, fieldContext.PointerField);
setterBody.Add(OpCodes.Call, imports.IL2CPP_il2cpp_field_get_offset.Value);
Expand Down
6 changes: 6 additions & 0 deletions Il2CppInterop.Generator/Utils/RuntimeAssemblyReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ public RuntimeAssemblyReferences(ModuleDefinition module, RewriteGlobalContext g
public TypeSignature RuntimeReflectionHelper { get; private set; }
public TypeSignature DelegateSupport { get; private set; }
public TypeSignature Il2CppException { get; private set; }
public TypeSignature Il2CppSystemValueType { get; private set; }
#nullable enable
private TypeSignature ResolveType(string typeName)
{
Expand All @@ -111,7 +112,9 @@ private void InitTypeRefs()
allTypes["System.Int64"] = Module.DefaultImporter.ImportTypeSignature(typeof(long));

var assemblyRef = new AssemblyReference("Il2CppInterop.Runtime", new Version(0, 0, 0, 0));
var il2CppmscorlibRef = new AssemblyReference("Il2Cppmscorlib", new Version(0, 0, 0, 0));
Module.AssemblyReferences.Add(assemblyRef);
Module.AssemblyReferences.Add(il2CppmscorlibRef);

Il2CppObjectBase =
new TypeReference(Module, assemblyRef, "Il2CppInterop.Runtime.InteropTypes", "Il2CppObjectBase").ToTypeSignature();
Expand Down Expand Up @@ -141,6 +144,8 @@ private void InitTypeRefs()

Il2CppException = new TypeReference(Module, assemblyRef, "Il2CppInterop.Runtime", "Il2CppException").ToTypeSignature();

Il2CppSystemValueType = new TypeReference(Module, il2CppmscorlibRef, "Il2CppSystem", "ValueType").ToTypeSignature();

allTypes["Il2CppInterop.Runtime.InteropTypes.Il2CppObjectBase"] = Il2CppObjectBase;
allTypes["Il2CppInterop.Runtime.Runtime.Il2CppObjectPool"] = Il2CppObjectPool;
allTypes["Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppArrayBase"] = nonGenericIl2CppArrayBase;
Expand All @@ -150,6 +155,7 @@ private void InitTypeRefs()
allTypes["Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppStructArray<T>"] = Il2CppStructArray;
allTypes["Il2CppInterop.Runtime.Il2CppException"] = Il2CppException;
allTypes["Il2CppInterop.Runtime.IL2CPP"] = Il2Cpp;
allTypes["Il2CppSystem.ValueType"] = Il2CppSystemValueType;
}

private void InitMethodRefs()
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 @@ -71,7 +71,7 @@ public static void GenerateInvokerMethodBody(MethodDefinition newMethod, FieldDe
else
{
body.EmitObjectToPointer(param.ParameterType, param.ParameterType, enclosingType, i + argOffset, false,
true, true, true, out var refVar);
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
Loading