mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Fixes to SetDeleted
This commit is contained in:
parent
8745b40828
commit
693334bdc8
5 changed files with 26 additions and 8 deletions
|
@ -151,7 +151,7 @@ namespace System
|
|||
[Error("Cannot be called directly"), SkipCall]
|
||||
static extern void SetDeletedX(void* dest, int size);
|
||||
[Error("Cannot be called directly"), SkipCall]
|
||||
static extern void SetDeleted(void* dest, int size, int32 align, int arrayCount);
|
||||
static extern void SetDeleted(void* dest, int size, int32 align);
|
||||
[Error("Cannot be called directly"), SkipCall]
|
||||
static extern void SetDeletedArray(void* dest, int size, int32 align, int arrayCount);
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ namespace System
|
|||
[Error("Cannot be called directly"), SkipCall]
|
||||
static extern void SetDeletedX(void* dest, int size);
|
||||
[Error("Cannot be called directly"), SkipCall]
|
||||
static extern void SetDeleted(void* dest, int size, int32 align, int arrayCount);
|
||||
static extern void SetDeleted(void* dest, int size, int32 align);
|
||||
[Error("Cannot be called directly"), SkipCall]
|
||||
static extern void SetDeletedArray(void* dest, int size, int32 align, int arrayCount);
|
||||
|
||||
|
|
|
@ -13045,7 +13045,7 @@ void BfModule::EmitDeferredScopeCalls(bool useSrcPositions, BfScopeData* scopeDa
|
|||
continue;
|
||||
}
|
||||
auto prevHead = checkScope->mDeferredCallEntries.mHead;
|
||||
EmitDeferredCall(*deferredCallEntry);
|
||||
EmitDeferredCall(*deferredCallEntry, true);
|
||||
if (prevHead != checkScope->mDeferredCallEntries.mHead)
|
||||
{
|
||||
// The list changed, start over and ignore anything we've already handled
|
||||
|
@ -13056,7 +13056,7 @@ void BfModule::EmitDeferredScopeCalls(bool useSrcPositions, BfScopeData* scopeDa
|
|||
}
|
||||
else
|
||||
{
|
||||
EmitDeferredCall(*deferredCallEntry);
|
||||
EmitDeferredCall(*deferredCallEntry, true);
|
||||
deferredCallEntry = deferredCallEntry->mNext;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1490,7 +1490,7 @@ public:
|
|||
bool AddDeferredCallEntry(BfDeferredCallEntry* deferredCallEntry, BfScopeData* scope);
|
||||
void AddDeferredBlock(BfBlock* block, BfScopeData* scope, Array<BfDeferredCapture>* captures = NULL);
|
||||
BfDeferredCallEntry* AddDeferredCall(const BfModuleMethodInstance& moduleMethodInstance, SizedArrayImpl<BfIRValue>& llvmArgs, BfScopeData* scope, BfAstNode* srcNode = NULL, bool bypassVirtual = false, bool doNullCheck = false);
|
||||
void EmitDeferredCall(BfDeferredCallEntry& deferredCallEntry);
|
||||
void EmitDeferredCall(BfDeferredCallEntry& deferredCallEntry, bool moveBlocks);
|
||||
void EmitDeferredCallProcessor(SLIList<BfDeferredCallEntry*>& callEntries, BfIRValue callTail);
|
||||
bool CanCast(BfTypedValue typedVal, BfType* toType, BfCastFlags castFlags = BfCastFlags_None);
|
||||
bool AreSplatsCompatible(BfType* fromType, BfType* toType, bool* outNeedsMemberCasting);
|
||||
|
|
|
@ -562,7 +562,8 @@ void BfModule::EmitDeferredCall(BfModuleMethodInstance moduleMethodInstance, Siz
|
|||
constant = mBfIRBuilder->GetConstant(llvmArgs[2]);
|
||||
if (constant != NULL)
|
||||
typeAlign = constant->mInt64;
|
||||
auto arraySize = llvmArgs[3];
|
||||
if (llvmArgs.size() >= 4)
|
||||
arraySize = llvmArgs[3];
|
||||
|
||||
intptr allocSize = typeSize;
|
||||
if (arraySize)
|
||||
|
@ -641,6 +642,12 @@ void BfModule::EmitDeferredCall(BfModuleMethodInstance moduleMethodInstance, Siz
|
|||
|
||||
mBfIRBuilder->AddBlock(ddDoneBlock);
|
||||
mBfIRBuilder->SetInsertPoint(ddDoneBlock);
|
||||
|
||||
if ((flags & BfDeferredBlockFlag_MoveNewBlocksToEnd) != 0)
|
||||
{
|
||||
mCurMethodState->mCurScope->mAtEndBlocks.push_back(ddSize1Block);
|
||||
mCurMethodState->mCurScope->mAtEndBlocks.push_back(ddDoneBlock);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -682,6 +689,15 @@ void BfModule::EmitDeferredCall(BfModuleMethodInstance moduleMethodInstance, Siz
|
|||
|
||||
mBfIRBuilder->AddBlock(ddDoneBlock);
|
||||
mBfIRBuilder->SetInsertPoint(ddDoneBlock);
|
||||
|
||||
if ((flags & BfDeferredBlockFlag_MoveNewBlocksToEnd) != 0)
|
||||
{
|
||||
mCurMethodState->mCurScope->mAtEndBlocks.push_back(ddSizePtrBlock);
|
||||
mCurMethodState->mCurScope->mAtEndBlocks.push_back(ddCheck1Block);
|
||||
if (mayBeZero)
|
||||
mCurMethodState->mCurScope->mAtEndBlocks.push_back(ddSize1Block);
|
||||
mCurMethodState->mCurScope->mAtEndBlocks.push_back(ddDoneBlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -764,7 +780,7 @@ void BfModule::EmitDeferredCall(BfModuleMethodInstance moduleMethodInstance, Siz
|
|||
}
|
||||
}
|
||||
|
||||
void BfModule::EmitDeferredCall(BfDeferredCallEntry& deferredCallEntry)
|
||||
void BfModule::EmitDeferredCall(BfDeferredCallEntry& deferredCallEntry, bool moveBlocks)
|
||||
{
|
||||
if ((mCompiler->mIsResolveOnly) && (deferredCallEntry.mHandlerCount > 0))
|
||||
{
|
||||
|
@ -833,6 +849,8 @@ void BfModule::EmitDeferredCall(BfDeferredCallEntry& deferredCallEntry)
|
|||
flags = (BfDeferredBlockFlags)(flags | BfDeferredBlockFlag_BypassVirtual);
|
||||
if (deferredCallEntry.mDoNullCheck)
|
||||
flags = (BfDeferredBlockFlags)(flags | BfDeferredBlockFlag_DoNullChecks | BfDeferredBlockFlag_SkipObjectAccessCheck | BfDeferredBlockFlag_MoveNewBlocksToEnd);
|
||||
if (moveBlocks)
|
||||
flags = (BfDeferredBlockFlags)(flags | BfDeferredBlockFlag_MoveNewBlocksToEnd);
|
||||
|
||||
EmitDeferredCall(deferredCallEntry.mModuleMethodInstance, args, flags);
|
||||
}
|
||||
|
@ -996,7 +1014,7 @@ void BfModule::EmitDeferredCallProcessor(SLIList<BfDeferredCallEntry*>& callEntr
|
|||
}
|
||||
|
||||
auto prevHead = callEntries.mHead;
|
||||
EmitDeferredCall(*deferredCallEntry);
|
||||
EmitDeferredCall(*deferredCallEntry, moveBlocks);
|
||||
ValueScopeEnd(valueScopeStart);
|
||||
mBfIRBuilder->CreateBr(condBB);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue