1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-23 10:08:00 +02:00

Appended fields

This commit is contained in:
Brian Fiete 2022-06-27 10:55:31 -07:00
parent 52544e6782
commit 1d2811f50d
22 changed files with 596 additions and 52 deletions

View file

@ -149,6 +149,19 @@ namespace System
public static void ExcludeThreadId(int thereadId) {}
#endif
static void MarkAppendedObject(Object obj)
{
#if BF_ENABLE_REALTIME_LEAK_CHECK
ClassVData* maskedVData = (ClassVData*)(void*)(obj.[Friend]mClassVData & ~(int)0xFF);
if (maskedVData == null)
return;
#else
if (obj.mClassVData == null)
return;
#endif
obj.[Friend]GCMarkMembers();
}
static void MarkDerefedObject(Object* obj)
{
#if BF_ENABLE_REALTIME_LEAK_CHECK

View file

@ -89,6 +89,8 @@ namespace System
[CallingConvention(.Cdecl), NoReturn]
public static extern void ThrowIndexOutOfRange(int stackOffset = 0);
[CallingConvention(.Cdecl), NoReturn]
public static extern void ThrowObjectNotInitialized(int stackOffset = 0);
[CallingConvention(.Cdecl), NoReturn]
public static extern void FatalError(String error, int stackOffset = 0);
[Intrinsic("memcpy")]
public static extern void MemCpy(void* dest, void* src, int length, int32 align = 1, bool isVolatile = false);

View file

@ -8,7 +8,8 @@ namespace System.Reflection
public enum Error
{
InvalidTargetType,
InvalidValueType
InvalidValueType,
AppendedField
}
TypeInstance mTypeInstance;
@ -24,6 +25,7 @@ namespace System.Reflection
public int32 MemberOffset => (int32)mFieldData.mData;
public Type FieldType => Type.[Friend]GetType(mFieldData.mFieldTypeId);
public bool IsConst => mFieldData.mFlags.HasFlag(.Const);
public bool IsAppended => mFieldData.mFlags.HasFlag(.Appended);
public bool IsEnumCase => mFieldData.mFlags.HasFlag(.EnumCase);
public bool IsReadOnly => mFieldData.mFlags.HasFlag(.ReadOnly);
public bool IsStatic => mFieldData.mFlags.HasFlag(.Static);
@ -86,7 +88,12 @@ namespace System.Reflection
if (valueType == fieldType)
{
if (valueType.IsObject)
{
if (mFieldData.mFlags.HasFlag(.Appended))
return .Err(.AppendedField);
*((void**)dataAddr) = Internal.UnsafeCastToPtr(value);
}
else
Internal.MemCpy(dataAddr, valueDataAddr, fieldType.[Friend]mSize);
}
@ -385,7 +392,10 @@ namespace System.Reflection
if (typeCode == TypeCode.Object)
{
value.[Friend]mStructType = 0;
value.[Friend]mData = *(int*)targetDataAddr;
if (mFieldData.mFlags.HasFlag(.Appended))
value.[Friend]mData = (int)targetDataAddr;
else
value.[Friend]mData = *(int*)targetDataAddr;
}
else
{

View file

@ -1480,6 +1480,7 @@ namespace System.Reflection
EnumDiscriminator = 0x0200,
EnumCase = 0x0400,
ReadOnly = 0x0800,
Appended = 0x1000,
}
public enum MethodFlags : uint16