1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-07 19:18:19 +02:00

Fixed allocFlag handling in Dbg_ObjectCreatedEx and Dbg_ObjectAllocatedEx

This commit is contained in:
Brian Fiete 2025-05-16 08:37:54 +02:00
parent dd9bc6636b
commit 95a9c7aa8e
3 changed files with 14 additions and 12 deletions

View file

@ -292,11 +292,11 @@ namespace System
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public static extern void Dbg_ObjectCreated(Object obj, int size, ClassVData* classVData); public static extern void Dbg_ObjectCreated(Object obj, int size, ClassVData* classVData);
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public static extern void Dbg_ObjectCreatedEx(Object obj, int size, ClassVData* classVData); public static extern void Dbg_ObjectCreatedEx(Object obj, int size, ClassVData* classVData, uint8 allocFlags);
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public static extern void Dbg_ObjectAllocated(Object obj, int size, ClassVData* classVData); public static extern void Dbg_ObjectAllocated(Object obj, int size, ClassVData* classVData);
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public static extern void Dbg_ObjectAllocatedEx(Object obj, int size, ClassVData* classVData); public static extern void Dbg_ObjectAllocatedEx(Object obj, int size, ClassVData* classVData, uint8 allocFlags);
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]
public static extern int Dbg_PrepareStackTrace(int baseAllocSize, int maxStackTraceDepth); public static extern int Dbg_PrepareStackTrace(int baseAllocSize, int maxStackTraceDepth);
[CallingConvention(.Cdecl)] [CallingConvention(.Cdecl)]

View file

@ -46,9 +46,9 @@ namespace bf
BFRT_EXPORT void Dbg_ReserveMetadataBytes(intptr metadataBytes, intptr& curAllocBytes); BFRT_EXPORT void Dbg_ReserveMetadataBytes(intptr metadataBytes, intptr& curAllocBytes);
BFRT_EXPORT void* Dbg_GetMetadata(System::Object* obj); BFRT_EXPORT void* Dbg_GetMetadata(System::Object* obj);
BFRT_EXPORT static void Dbg_ObjectCreated(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData); BFRT_EXPORT static void Dbg_ObjectCreated(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData);
BFRT_EXPORT static void Dbg_ObjectCreatedEx(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData); BFRT_EXPORT static void Dbg_ObjectCreatedEx(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData, uint8 allocFlags);
BFRT_EXPORT static void Dbg_ObjectAllocated(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData); BFRT_EXPORT static void Dbg_ObjectAllocated(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData);
BFRT_EXPORT static void Dbg_ObjectAllocatedEx(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData); BFRT_EXPORT static void Dbg_ObjectAllocatedEx(bf::System::Object* result, intptr size, bf::System::ClassVData* classVData, uint8 allocFlags);
BFRT_EXPORT static Object* Dbg_ObjectAlloc(bf::System::Reflection::TypeInstance* typeInst, intptr size); BFRT_EXPORT static Object* Dbg_ObjectAlloc(bf::System::Reflection::TypeInstance* typeInst, intptr size);
BFRT_EXPORT static Object* Dbg_ObjectAlloc(bf::System::ClassVData* classVData, intptr size, intptr align, intptr maxStackTraceDept, uint8 allocFlags); BFRT_EXPORT static Object* Dbg_ObjectAlloc(bf::System::ClassVData* classVData, intptr size, intptr align, intptr maxStackTraceDept, uint8 allocFlags);
BFRT_EXPORT static void Dbg_MarkObjectDeleted(bf::System::Object* obj); BFRT_EXPORT static void Dbg_MarkObjectDeleted(bf::System::Object* obj);
@ -455,7 +455,7 @@ void Internal::Dbg_ObjectStackInit(bf::System::Object* result, bf::System::Class
#endif #endif
} }
static void SetupDbgAllocInfo(bf::System::Object* result, intptr origSize) static void SetupDbgAllocInfo(bf::System::Object* result, intptr origSize, uint8 allocFlags)
{ {
#ifndef BFRT_NODBGFLAGS #ifndef BFRT_NODBGFLAGS
if (gPendingAllocState.mStackTraceCount == 0) if (gPendingAllocState.mStackTraceCount == 0)
@ -472,13 +472,13 @@ static void SetupDbgAllocInfo(bf::System::Object* result, intptr origSize)
{ {
result->mClassVData |= (intptr)BfObjectFlag_AllocInfo; result->mClassVData |= (intptr)BfObjectFlag_AllocInfo;
result->mDbgAllocInfo = origSize; result->mDbgAllocInfo = origSize;
*(intptr*)((uint8*)result + origSize) = gPendingAllocState.mStackTraceCount; *(intptr*)((uint8*)result + origSize) = (gPendingAllocState.mStackTraceCount << 8) | allocFlags;
memcpy((uint8*)result + origSize + sizeof(intptr), gPendingAllocState.mStackTrace, gPendingAllocState.mStackTraceCount * sizeof(intptr)); memcpy((uint8*)result + origSize + sizeof(intptr), gPendingAllocState.mStackTrace, gPendingAllocState.mStackTraceCount * sizeof(intptr));
} }
else else
{ {
result->mClassVData |= (intptr)BfObjectFlag_AllocInfo_Short; result->mClassVData |= (intptr)BfObjectFlag_AllocInfo_Short;
result->mDbgAllocInfo = (origSize << 16) | gPendingAllocState.mStackTraceCount; result->mDbgAllocInfo = (origSize << 16) | (((intptr)allocFlags) << 8) | gPendingAllocState.mStackTraceCount;
memcpy((uint8*)result + origSize, gPendingAllocState.mStackTrace, gPendingAllocState.mStackTraceCount * sizeof(intptr)); memcpy((uint8*)result + origSize, gPendingAllocState.mStackTrace, gPendingAllocState.mStackTraceCount * sizeof(intptr));
} }
#endif #endif
@ -493,12 +493,12 @@ void Internal::Dbg_ObjectCreated(bf::System::Object* result, intptr size, bf::Sy
#endif #endif
} }
void Internal::Dbg_ObjectCreatedEx(bf::System::Object* result, intptr origSize, bf::System::ClassVData* classVData) void Internal::Dbg_ObjectCreatedEx(bf::System::Object* result, intptr origSize, bf::System::ClassVData* classVData, uint8 allocFlags)
{ {
BF_ASSERT((BFRTFLAGS & BfRtFlags_ObjectHasDebugFlags) != 0); BF_ASSERT((BFRTFLAGS & BfRtFlags_ObjectHasDebugFlags) != 0);
#ifndef BFRT_NODBGFLAGS #ifndef BFRT_NODBGFLAGS
BF_ASSERT_REL((result->mClassVData & ~(BfObjectFlag_Allocated | BfObjectFlag_Mark3)) == (intptr)classVData); BF_ASSERT_REL((result->mClassVData & ~(BfObjectFlag_Allocated | BfObjectFlag_Mark3)) == (intptr)classVData);
SetupDbgAllocInfo(result, origSize); SetupDbgAllocInfo(result, origSize, allocFlags);
#endif #endif
} }
@ -511,11 +511,11 @@ void Internal::Dbg_ObjectAllocated(bf::System::Object* result, intptr size, bf::
#endif #endif
} }
void Internal::Dbg_ObjectAllocatedEx(bf::System::Object* result, intptr origSize, bf::System::ClassVData* classVData) void Internal::Dbg_ObjectAllocatedEx(bf::System::Object* result, intptr origSize, bf::System::ClassVData* classVData, uint8 allocFlags)
{ {
BF_ASSERT((BFRTFLAGS & BfRtFlags_ObjectHasDebugFlags) != 0); BF_ASSERT((BFRTFLAGS & BfRtFlags_ObjectHasDebugFlags) != 0);
result->mClassVData = (intptr)classVData; result->mClassVData = (intptr)classVData;
SetupDbgAllocInfo(result, origSize); SetupDbgAllocInfo(result, origSize, allocFlags);
} }
void Internal::Dbg_ObjectPreDelete(bf::System::Object* object) void Internal::Dbg_ObjectPreDelete(bf::System::Object* object)

View file

@ -10461,9 +10461,11 @@ BfIRValue BfModule::AllocFromType(BfType* type, const BfAllocTarget& allocTarget
llvmArgs.push_back(objectPtr); llvmArgs.push_back(objectPtr);
llvmArgs.push_back(origSizeValue); llvmArgs.push_back(origSizeValue);
llvmArgs.push_back(vDataRef); llvmArgs.push_back(vDataRef);
if (isAllocEx)
llvmArgs.push_back(mBfIRBuilder->CreateConst(BfTypeCode_Int8, allocFlags));
auto objectCreatedMethod = GetInternalMethod(isAllocEx ? auto objectCreatedMethod = GetInternalMethod(isAllocEx ?
(isResultInitialized ? "Dbg_ObjectCreatedEx" : "Dbg_ObjectAllocatedEx") : (isResultInitialized ? "Dbg_ObjectCreatedEx" : "Dbg_ObjectAllocatedEx") :
(isResultInitialized ? "Dbg_ObjectCreated" : "Dbg_ObjectAllocated")); (isResultInitialized ? "Dbg_ObjectCreated" : "Dbg_ObjectAllocated"));
mBfIRBuilder->CreateCall(objectCreatedMethod.mFunc, llvmArgs); mBfIRBuilder->CreateCall(objectCreatedMethod.mFunc, llvmArgs);
if (wasAllocated) if (wasAllocated)