From b449353d2ff21eda233eac4447a264ca225f1d2c Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Wed, 21 Dec 2022 20:47:40 +0200 Subject: [PATCH] Fix incorrect field reference for reference types --- Source/Engine/Engine/NativeInterop.cs | 41 ++++++++------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index 4c06527eb..f76f1e4a5 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -1200,17 +1200,20 @@ namespace FlaxEngine /// /// Returns a reference to the value of the field. - /// + /// private static ref TField GetFieldReference(FieldInfo field, ref T fieldOwner) { - Assert.IsTrue(!field.IsInitOnly); - // Get the address of the field, source: https://stackoverflow.com/a/56512720 - byte* fieldPtr = (byte*)Unsafe.AsPointer(ref fieldOwner) + (Marshal.ReadInt32(field.FieldHandle.Value + 4 + IntPtr.Size) & 0xFFFFFF); if (typeof(T).IsValueType) + { + byte* fieldPtr = (byte*)Unsafe.AsPointer(ref fieldOwner) + (Marshal.ReadInt32(field.FieldHandle.Value + 4 + IntPtr.Size) & 0xFFFFFF); return ref Unsafe.AsRef(fieldPtr); + } else - return ref Unsafe.AsRef(fieldPtr + IntPtr.Size); + { + byte* fieldPtr = (byte*)Unsafe.As(ref fieldOwner) + IntPtr.Size + (Marshal.ReadInt32(field.FieldHandle.Value + 4 + IntPtr.Size) & 0xFFFFFF); + return ref Unsafe.AsRef(fieldPtr); + } } private static IntPtr EnsureAlignment(IntPtr ptr, int alignment) @@ -1278,18 +1281,8 @@ namespace FlaxEngine fieldOffset += (fieldPtr - startPtr).ToInt32(); } - if (field.IsInitOnly) - { - //TypedReference ownerRef = __makeref(fieldOwner); - //TField fieldValue = (TField)field.GetValueDirect(ownerRef); - TField fieldValue = (TField)field.GetValue(fieldOwner); - MarshalHelperValueType.ToNative(ref fieldValue, fieldPtr); - } - else - { - ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); - MarshalHelperValueType.ToNative(ref fieldValueRef, fieldPtr); - } + ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + MarshalHelperValueType.ToNative(ref fieldValueRef, fieldPtr); } } @@ -1304,18 +1297,8 @@ namespace FlaxEngine internal static void ToNativeField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) { - if (field.IsInitOnly) - { - //TypedReference ownerRef = __makeref(fieldOwner); - //TField fieldValue = (TField)field.GetValueDirect(ownerRef); - TField fieldValue = (TField)field.GetValue(fieldOwner); - MarshalHelperReferenceType.ToNative(ref fieldValue, fieldPtr); - } - else - { - ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); - MarshalHelperReferenceType.ToNative(ref fieldValueRef, fieldPtr); - } + ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + MarshalHelperReferenceType.ToNative(ref fieldValueRef, fieldPtr); fieldOffset = IntPtr.Size; } }