diff --git a/BeefLibs/corlib/src/Internal.bf b/BeefLibs/corlib/src/Internal.bf index 347b0fd4..166cf00f 100644 --- a/BeefLibs/corlib/src/Internal.bf +++ b/BeefLibs/corlib/src/Internal.bf @@ -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); diff --git a/IDE/mintest/minlib/src/System/Internal.bf b/IDE/mintest/minlib/src/System/Internal.bf index 9c564cfb..6e52d1a0 100644 --- a/IDE/mintest/minlib/src/System/Internal.bf +++ b/IDE/mintest/minlib/src/System/Internal.bf @@ -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); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 72e8959b..c9eedba0 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -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; } } diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 9e840da5..cf8c3ae8 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1490,7 +1490,7 @@ public: bool AddDeferredCallEntry(BfDeferredCallEntry* deferredCallEntry, BfScopeData* scope); void AddDeferredBlock(BfBlock* block, BfScopeData* scope, Array* captures = NULL); BfDeferredCallEntry* AddDeferredCall(const BfModuleMethodInstance& moduleMethodInstance, SizedArrayImpl& 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& callEntries, BfIRValue callTail); bool CanCast(BfTypedValue typedVal, BfType* toType, BfCastFlags castFlags = BfCastFlags_None); bool AreSplatsCompatible(BfType* fromType, BfType* toType, bool* outNeedsMemberCasting); diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index ac663b78..8ad2394f 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -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& callEntr } auto prevHead = callEntries.mHead; - EmitDeferredCall(*deferredCallEntry); + EmitDeferredCall(*deferredCallEntry, moveBlocks); ValueScopeEnd(valueScopeStart); mBfIRBuilder->CreateBr(condBB);