From 9d8647cd848c7bc36d4dfdbb55d3a9ccd693cc2a Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 23 Jan 2025 13:01:52 -0800 Subject: [PATCH] Recursive type rebuild fix --- IDEHelper/Compiler/BfContext.cpp | 18 ++++++++++++++++++ IDEHelper/Compiler/BfContext.h | 1 + IDEHelper/Compiler/BfResolvedTypeUtils.h | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index e8319c74..ca1c7c32 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -1032,6 +1032,12 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild return; } + typeInst->mRebuildFlags = (BfTypeRebuildFlags)(typeInst->mRebuildFlags | BfTypeRebuildFlag_InRebuildType); + defer( + { + typeInst->mRebuildFlags = (BfTypeRebuildFlags)(typeInst->mRebuildFlags & ~BfTypeRebuildFlag_InRebuildType); + }); + if (mCompiler->mCeMachine != NULL) mCompiler->mCeMachine->ClearTypeData(typeInst); @@ -1369,6 +1375,11 @@ void BfContext::RebuildDependentTypes_MidCompile(BfDependedType* dType, const St } } +bool BfContext::IsRebuilding(BfType* type) +{ + return ((type->mRebuildFlags & BfTypeRebuildFlag_InRebuildType) != 0); +} + bool BfContext::CanRebuild(BfType* type) { if (type->mRevision == mCompiler->mRevision) @@ -2007,6 +2018,10 @@ void BfContext::DeleteType(BfType* type, bool deferDepRebuilds) { RebuildType(dependentType); } + else if (IsRebuilding(dependentType)) + { + // Ignore + } else if (dependentTypeInst != NULL) { mGhostDependencies.Add(type); @@ -3409,6 +3424,9 @@ void BfContext::MarkUsedModules(BfProject* project, BfModule* module) { BP_ZONE("BfContext::MarkUsedModules"); + if (module->mIsDeleting) + return; + BF_ASSERT_REL(!module->mIsDeleting); if (module->mIsScratchModule) diff --git a/IDEHelper/Compiler/BfContext.h b/IDEHelper/Compiler/BfContext.h index 7b3e05e5..5671e34a 100644 --- a/IDEHelper/Compiler/BfContext.h +++ b/IDEHelper/Compiler/BfContext.h @@ -503,6 +503,7 @@ public: void RebuildDependentTypes(BfDependedType* dType); void QueueMidCompileRebuildDependentTypes(BfDependedType* dType, const String& reason); void RebuildDependentTypes_MidCompile(BfDependedType* dType, const String& reason); + bool IsRebuilding(BfType* type); bool CanRebuild(BfType* type); void TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChange); void TypeMethodSignaturesChanged(BfTypeInstance* typeInst); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 525aefaf..2189ecf2 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -449,7 +449,8 @@ enum BfTypeRebuildFlags BfTypeRebuildFlag_RebuildQueued = 0x20000, BfTypeRebuildFlag_ConstEvalCancelled = 0x40000, BfTypeRebuildFlag_ChangedMidCompile = 0x80000, - BfTypeRebuildFlag_PendingGenericArgDep = 0x100000 + BfTypeRebuildFlag_PendingGenericArgDep = 0x100000, + BfTypeRebuildFlag_InRebuildType = 0x200000 }; class BfTypeDIReplaceCallback;