Fixes for dotnet7 bindings to pass unit tests

This commit is contained in:
Wojciech Figat
2023-01-03 14:34:16 +01:00
parent 6a2c5169a9
commit ceacdc8d08
3 changed files with 169 additions and 146 deletions

View File

@@ -1255,9 +1255,9 @@ namespace FlaxEngine
return method.CreateDelegate<MarshalToManagedDelegate>();
}
if (toManagedMarshallers.TryGetValue(type, out var deleg))
return deleg(nativePtr, type.IsByRef);
return toManagedMarshallers.GetOrAdd(type, Factory)(nativePtr, type.IsByRef);
if (!toManagedMarshallers.TryGetValue(type, out var deleg))
deleg = toManagedMarshallers.GetOrAdd(type, Factory);
return deleg(nativePtr, type.IsByRef);
}
internal static void MarshalToNative(object managedObject, IntPtr nativePtr, Type type)
@@ -1272,10 +1272,9 @@ namespace FlaxEngine
return method.CreateDelegate<MarshalToNativeDelegate>();
}
if (toNativeMarshallers.TryGetValue(type, out var deleg))
deleg(managedObject, nativePtr);
else
toNativeMarshallers.GetOrAdd(type, Factory)(managedObject, nativePtr);
if (!toNativeMarshallers.TryGetValue(type, out var deleg))
deleg = toNativeMarshallers.GetOrAdd(type, Factory);
deleg(managedObject, nativePtr);
}
internal static MarshalToNativeFieldDelegate GetToNativeFieldMarshallerDelegate(Type type)
@@ -1406,6 +1405,20 @@ namespace FlaxEngine
toManagedTypedMarshaller(ref managedValue, nativePtr, byRef);
}
internal static T ToManagedUnbox(IntPtr nativePtr)
{
T managed = default;
if (nativePtr != IntPtr.Zero)
{
Type type = typeof(T);
if (type.IsArray)
managed = (T)MarshalToManaged(nativePtr, type); // Array might be in internal format of custom structs so unbox if need to
else
managed = (T)ManagedHandle.FromIntPtr(nativePtr).Target;
}
return managed;
}
internal static Array ToManagedArray(Span<IntPtr> ptrSpan)
{
T[] arr = new T[ptrSpan.Length];
@@ -1414,6 +1427,18 @@ namespace FlaxEngine
return arr;
}
internal static Array ToManagedArray(ManagedArray nativeArray)
{
T[] arr = new T[nativeArray.Length];
IntPtr nativePtr = nativeArray.GetPointer;
for (int i = 0; i < arr.Length; i++)
{
toManagedTypedMarshaller(ref arr[i], nativePtr, false);
nativePtr += nativeArray.ElementSize;
}
return arr;
}
internal static void ToNative(ref T managedValue, IntPtr nativePtr)
{
toNativeTypedMarshaller(ref managedValue, nativePtr);
@@ -1604,7 +1629,8 @@ namespace FlaxEngine
internal static void ToManagedArray(ref T[] managedValue, IntPtr nativePtr, bool byRef)
{
Assert.IsTrue(!byRef);
if (byRef)
nativePtr = Marshal.ReadIntPtr(nativePtr);
Type elementType = typeof(T);
if (nativePtr != IntPtr.Zero)
@@ -1612,6 +1638,8 @@ namespace FlaxEngine
ManagedArray managedArray = Unsafe.As<ManagedArray>(ManagedHandle.FromIntPtr(nativePtr).Target);
if (ArrayFactory.GetMarshalledType(elementType) == elementType)
managedValue = Unsafe.As<T[]>(managedArray.GetArray<T>());
else if (elementType.IsValueType)
managedValue = Unsafe.As<T[]>(MarshalHelper<T>.ToManagedArray(managedArray));
else
managedValue = Unsafe.As<T[]>(MarshalHelper<T>.ToManagedArray(managedArray.GetSpan<IntPtr>()));
}
@@ -1671,9 +1699,9 @@ namespace FlaxEngine
internal static void ToManagedArray(ref T[] managedValue, IntPtr nativePtr, bool byRef)
{
Assert.IsTrue(!byRef);
if (byRef)
nativePtr = Marshal.ReadIntPtr(nativePtr);
Type elementType = typeof(T);
if (nativePtr != IntPtr.Zero)
{
ManagedArray managedArray = Unsafe.As<ManagedArray>(ManagedHandle.FromIntPtr(nativePtr).Target);
@@ -1708,10 +1736,25 @@ namespace FlaxEngine
else
{
var elementType = type.GetElementType();
if (ArrayFactory.GetMarshalledType(elementType) == elementType)
managedPtr = ManagedHandle.ToIntPtr(ManagedHandle.Alloc(ManagedArray.WrapNewArray(Unsafe.As<Array>(managedValue)), GCHandleType.Weak));
var arr = Unsafe.As<Array>(managedValue);
var marshalledType = ArrayFactory.GetMarshalledType(elementType);
ManagedArray managedArray;
if (marshalledType == elementType)
managedArray = ManagedArray.WrapNewArray(arr);
else if (elementType.IsValueType)
{
// Convert array of custom structures into internal native layout
managedArray = ManagedArray.AllocateNewArray(arr.Length, Marshal.SizeOf(marshalledType));
IntPtr managedArrayPtr = managedArray.GetPointer;
for (int i = 0; i < arr.Length; i++)
{
MarshalToNative(arr.GetValue(i), managedArrayPtr, elementType);
managedArrayPtr += managedArray.ElementSize;
}
}
else
managedPtr = ManagedHandle.ToIntPtr(ManagedHandle.Alloc(ManagedArray.WrapNewArray(ManagedArrayToGCHandleArray(Unsafe.As<Array>(managedValue))), GCHandleType.Weak));
managedArray = ManagedArray.WrapNewArray(ManagedArrayToGCHandleArray(arr));
managedPtr = ManagedHandle.ToIntPtr(ManagedHandle.Alloc(managedArray, GCHandleType.Weak));
}
}
else
@@ -1756,10 +1799,15 @@ namespace FlaxEngine
genericParamTypes.Add(type);
}
string typeName = $"FlaxEngine.NativeInterop+Invoker+Invoker{(method.IsStatic ? "Static" : "")}{(method.ReturnType != typeof(void) ? "Ret" : "NoRet")}{parameterTypes.Length}{(genericParamTypes.Count > 0 ? "`" + genericParamTypes.Count : "")}";
Type invokerType = genericParamTypes.Count == 0 ? Type.GetType(typeName) : Type.GetType(typeName).MakeGenericType(genericParamTypes.ToArray());
invokeDelegate = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.MarshalAndInvoke), BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate<Invoker.MarshalAndInvokeDelegate>();
delegInvoke = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.CreateDelegate), BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { method });
string invokerTypeName = $"FlaxEngine.NativeInterop+Invoker+Invoker{(method.IsStatic ? "Static" : "")}{(method.ReturnType != typeof(void) ? "Ret" : "NoRet")}{parameterTypes.Length}{(genericParamTypes.Count > 0 ? "`" + genericParamTypes.Count : "")}";
Type invokerType = Type.GetType(invokerTypeName);
if (invokerType != null)
{
if (genericParamTypes.Count != 0)
invokerType = invokerType.MakeGenericType(genericParamTypes.ToArray());
invokeDelegate = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.MarshalAndInvoke), BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate<Invoker.MarshalAndInvokeDelegate>();
delegInvoke = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.CreateDelegate), BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { method });
}
}
outDeleg = invokeDelegate;
@@ -2267,13 +2315,12 @@ namespace FlaxEngine
// Slow path, method parameters needs to be stored in heap
object returnObject;
int numParams = methodHolder.parameterTypes.Length;
IntPtr* nativePtrs = stackalloc IntPtr[numParams];
object[] methodParameters = new object[numParams];
for (int i = 0; i < numParams; i++)
{
nativePtrs[i] = Marshal.ReadIntPtr(IntPtr.Add(paramPtr, sizeof(IntPtr) * i));
methodParameters[i] = MarshalToManaged(nativePtrs[i], methodHolder.parameterTypes[i]);
IntPtr nativePtr = Marshal.ReadIntPtr(IntPtr.Add(paramPtr, sizeof(IntPtr) * i));
methodParameters[i] = MarshalToManaged(nativePtr, methodHolder.parameterTypes[i]);
}
try
@@ -2299,7 +2346,10 @@ namespace FlaxEngine
{
Type parameterType = methodHolder.parameterTypes[i];
if (parameterType.IsByRef)
MarshalToNative(methodParameters[i], nativePtrs[i], parameterType.GetElementType());
{
IntPtr nativePtr = Marshal.ReadIntPtr(IntPtr.Add(paramPtr, sizeof(IntPtr) * i));
MarshalToNative(methodParameters[i], nativePtr, parameterType.GetElementType());
}
}
if (returnObject is not null)

View File

@@ -95,6 +95,19 @@ namespace FlaxEngine
else
return ManagedHandle.ToIntPtr(ManagedHandle.Alloc(ManagedArray.WrapNewArray(ManagedArrayToGCHandleArray(Unsafe.As<Array>(returnValue))), GCHandleType.Weak));
}
// Match Mono bindings and pass value as pointer to prevent boxing it
else if (typeof(TRet) == typeof(System.Int16))
return new IntPtr((int)(System.Int16)(object)returnValue);
else if (typeof(TRet) == typeof(System.Int32))
return new IntPtr((int)(System.Int32)(object)returnValue);
else if (typeof(TRet) == typeof(System.Int64))
return new IntPtr((long)(System.Int64)(object)returnValue);
else if (typeof(TRet) == typeof(System.UInt16))
return (IntPtr)new UIntPtr((ulong)(System.UInt16)(object)returnValue);
else if (typeof(TRet) == typeof(System.UInt32))
return (IntPtr)new UIntPtr((ulong)(System.UInt32)(object)returnValue);
else if (typeof(TRet) == typeof(System.UInt64))
return (IntPtr)new UIntPtr((ulong)(System.UInt64)(object)returnValue);
else
return returnValue != null ? ManagedHandle.ToIntPtr(ManagedHandle.Alloc(returnValue, GCHandleType.Weak)) : IntPtr.Zero;
}
@@ -163,8 +176,7 @@ namespace FlaxEngine
deleg(instancePtr.Target, ref param1);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
return IntPtr.Zero;
}
@@ -174,7 +186,7 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
deleg(instancePtr.Target, param1);
@@ -213,10 +225,8 @@ namespace FlaxEngine
deleg(instancePtr.Target, ref param1, ref param2);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
return IntPtr.Zero;
}
@@ -226,8 +236,8 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
deleg(instancePtr.Target, param1, param2);
@@ -269,12 +279,9 @@ namespace FlaxEngine
deleg(instancePtr.Target, ref param1, ref param2, ref param3);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
return IntPtr.Zero;
}
@@ -284,9 +291,9 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
deleg(instancePtr.Target, param1, param2, param3);
@@ -331,14 +338,10 @@ namespace FlaxEngine
deleg(instancePtr.Target, ref param1, ref param2, ref param3, ref param4);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef)
MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef) MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
return IntPtr.Zero;
}
@@ -348,10 +351,10 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T4 param4 = paramPtrs[3] != IntPtr.Zero ? (T4)ManagedHandle.FromIntPtr(paramPtrs[3]).Target : default(T4);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
T4 param4 = MarshalHelper<T4>.ToManagedUnbox(paramPtrs[3]);
deleg(instancePtr.Target, param1, param2, param3, param4);
@@ -423,8 +426,7 @@ namespace FlaxEngine
deleg(ref param1);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
return IntPtr.Zero;
}
@@ -434,7 +436,7 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
deleg(param1);
@@ -473,10 +475,8 @@ namespace FlaxEngine
deleg(ref param1, ref param2);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
return IntPtr.Zero;
}
@@ -486,8 +486,8 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
deleg(param1, param2);
@@ -529,12 +529,9 @@ namespace FlaxEngine
deleg(ref param1, ref param2, ref param3);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
return IntPtr.Zero;
}
@@ -544,9 +541,9 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
deleg(param1, param2, param3);
@@ -591,14 +588,10 @@ namespace FlaxEngine
deleg(ref param1, ref param2, ref param3, ref param4);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef)
MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef) MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
return IntPtr.Zero;
}
@@ -608,10 +601,10 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T4 param4 = paramPtrs[3] != IntPtr.Zero ? (T4)ManagedHandle.FromIntPtr(paramPtrs[3]).Target : default(T4);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
T4 param4 = MarshalHelper<T4>.ToManagedUnbox(paramPtrs[3]);
deleg(param1, param2, param3, param4);
@@ -683,8 +676,7 @@ namespace FlaxEngine
TRet ret = deleg(instancePtr.Target, ref param1);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
return MarshalReturnValue(ref ret);
}
@@ -694,7 +686,7 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
TRet ret = deleg(instancePtr.Target, param1);
@@ -733,10 +725,8 @@ namespace FlaxEngine
TRet ret = deleg(instancePtr.Target, ref param1, ref param2);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
return MarshalReturnValue(ref ret);
}
@@ -746,8 +736,8 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
TRet ret = deleg(instancePtr.Target, param1, param2);
@@ -789,12 +779,9 @@ namespace FlaxEngine
TRet ret = deleg(instancePtr.Target, ref param1, ref param2, ref param3);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
return MarshalReturnValue(ref ret);
}
@@ -804,9 +791,9 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
TRet ret = deleg(instancePtr.Target, param1, param2, param3);
@@ -851,14 +838,10 @@ namespace FlaxEngine
TRet ret = deleg(instancePtr.Target, ref param1, ref param2, ref param3, ref param4);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef)
MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef) MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
return MarshalReturnValue(ref ret);
}
@@ -868,10 +851,10 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T4 param4 = paramPtrs[3] != IntPtr.Zero ? (T4)ManagedHandle.FromIntPtr(paramPtrs[3]).Target : default(T4);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
T4 param4 = MarshalHelper<T4>.ToManagedUnbox(paramPtrs[3]);
TRet ret = deleg(instancePtr.Target, param1, param2, param3, param4);
@@ -943,8 +926,7 @@ namespace FlaxEngine
TRet ret = deleg(ref param1);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
return MarshalReturnValue(ref ret);
}
@@ -954,7 +936,7 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
TRet ret = deleg(param1);
@@ -993,10 +975,8 @@ namespace FlaxEngine
TRet ret = deleg(ref param1, ref param2);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
return MarshalReturnValue(ref ret);
}
@@ -1006,8 +986,8 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
TRet ret = deleg(param1, param2);
@@ -1049,12 +1029,9 @@ namespace FlaxEngine
TRet ret = deleg(ref param1, ref param2, ref param3);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
return MarshalReturnValue(ref ret);
}
@@ -1064,9 +1041,9 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
TRet ret = deleg(param1, param2, param3);
@@ -1111,14 +1088,10 @@ namespace FlaxEngine
TRet ret = deleg(ref param1, ref param2, ref param3, ref param4);
// Marshal reference parameters back to original unmanaged references
if (types[0].IsByRef)
MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef)
MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef)
MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef)
MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
if (types[0].IsByRef) MarshalHelper<T1>.ToNative(ref param1, param1Ptr);
if (types[1].IsByRef) MarshalHelper<T2>.ToNative(ref param2, param2Ptr);
if (types[2].IsByRef) MarshalHelper<T3>.ToNative(ref param3, param3Ptr);
if (types[3].IsByRef) MarshalHelper<T4>.ToNative(ref param4, param4Ptr);
return MarshalReturnValue(ref ret);
}
@@ -1128,10 +1101,10 @@ namespace FlaxEngine
{
ThunkInvokerDelegate deleg = Unsafe.As<ThunkInvokerDelegate>(delegateContext);
T1 param1 = paramPtrs[0] != IntPtr.Zero ? (T1)ManagedHandle.FromIntPtr(paramPtrs[0]).Target : default(T1);
T2 param2 = paramPtrs[1] != IntPtr.Zero ? (T2)ManagedHandle.FromIntPtr(paramPtrs[1]).Target : default(T2);
T3 param3 = paramPtrs[2] != IntPtr.Zero ? (T3)ManagedHandle.FromIntPtr(paramPtrs[2]).Target : default(T3);
T4 param4 = paramPtrs[3] != IntPtr.Zero ? (T4)ManagedHandle.FromIntPtr(paramPtrs[3]).Target : default(T4);
T1 param1 = MarshalHelper<T1>.ToManagedUnbox(paramPtrs[0]);
T2 param2 = MarshalHelper<T2>.ToManagedUnbox(paramPtrs[1]);
T3 param3 = MarshalHelper<T3>.ToManagedUnbox(paramPtrs[2]);
T4 param4 = MarshalHelper<T4>.ToManagedUnbox(paramPtrs[3]);
TRet ret = deleg(param1, param2, param3, param4);