From 3bafa11da9d889317f1fa9a601eaf9f2ca4233ea Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 10 Jan 2025 07:05:23 -0800 Subject: [PATCH] GetValueReference --- BeefLibs/corlib/src/Reflection/FieldInfo.bf | 82 +++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/BeefLibs/corlib/src/Reflection/FieldInfo.bf b/BeefLibs/corlib/src/Reflection/FieldInfo.bf index 7ce4b5d2..af144a43 100644 --- a/BeefLibs/corlib/src/Reflection/FieldInfo.bf +++ b/BeefLibs/corlib/src/Reflection/FieldInfo.bf @@ -454,6 +454,38 @@ namespace System.Reflection return value; } + public Result GetValueReference(void* startTargetDataAddr, Type tTarget) + { + void* targetDataAddr = startTargetDataAddr; + if (targetDataAddr == null) + { + if (mFieldData.mFlags.HasFlag(FieldFlags.Const)) + { + return (T*)&mFieldData.mData; + } + + if (!mFieldData.mFlags.HasFlag(FieldFlags.Static)) + return .Err; + + targetDataAddr = null; + } + else + { + if (!tTarget.IsSubtypeOf(mTypeInstance)) + return .Err; //Invalid type; + } + + targetDataAddr = (uint8*)targetDataAddr + (int)mFieldData.mData; + + Type fieldType = Type.[Friend]GetType(mFieldData.mFieldTypeId); + + TypeCode typeCode = fieldType.[Friend]mTypeCode; + if (typeCode == TypeCode.Enum) + typeCode = fieldType.UnderlyingType.[Friend]mTypeCode; + + return (T*)targetDataAddr; + } + public Result GetValue(Object target) { void* targetDataAddr; @@ -498,6 +530,32 @@ namespace System.Reflection } } + public Result GetValueReference(Object target) + { + if (FieldType != typeof(T)) + return .Err; + + void* targetDataAddr; + if (target == null) + { + if (mFieldData.mFlags.HasFlag(FieldFlags.Const)) + { + return (T*)&mFieldData.mData; + } + + if (!mFieldData.mFlags.HasFlag(FieldFlags.Static)) + return .Err; + + return GetValueReference(null, null); + } + else + { + Type tTarget; + targetDataAddr = GetDataPtrAndType(target, out tTarget); + return GetValueReference(targetDataAddr, tTarget); + } + } + public Result GetValueReference(Object target) { void* targetDataAddr; @@ -542,6 +600,30 @@ namespace System.Reflection } } + public Result GetValueReference(Variant target) + { + if (FieldType != typeof(T)) + return .Err; + + if (!target.HasValue) + { + if (mFieldData.mFlags.HasFlag(FieldFlags.Const)) + { + return (T*)&mFieldData.mData; + } + + if (!mFieldData.mFlags.HasFlag(FieldFlags.Static)) + return .Err; + + return GetValueReference(null, null); + } + else + { + var target; + return GetValueReference(target.DataPtr, target.VariantType); + } + } + public struct Enumerator : IEnumerator { BindingFlags mBindingFlags;