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

Recursive type rebuild fix

This commit is contained in:
Brian Fiete 2025-01-23 13:01:52 -08:00
parent 2d74aac74c
commit 9d8647cd84
3 changed files with 21 additions and 1 deletions

View file

@ -1032,6 +1032,12 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild
return; return;
} }
typeInst->mRebuildFlags = (BfTypeRebuildFlags)(typeInst->mRebuildFlags | BfTypeRebuildFlag_InRebuildType);
defer(
{
typeInst->mRebuildFlags = (BfTypeRebuildFlags)(typeInst->mRebuildFlags & ~BfTypeRebuildFlag_InRebuildType);
});
if (mCompiler->mCeMachine != NULL) if (mCompiler->mCeMachine != NULL)
mCompiler->mCeMachine->ClearTypeData(typeInst); 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) bool BfContext::CanRebuild(BfType* type)
{ {
if (type->mRevision == mCompiler->mRevision) if (type->mRevision == mCompiler->mRevision)
@ -2007,6 +2018,10 @@ void BfContext::DeleteType(BfType* type, bool deferDepRebuilds)
{ {
RebuildType(dependentType); RebuildType(dependentType);
} }
else if (IsRebuilding(dependentType))
{
// Ignore
}
else if (dependentTypeInst != NULL) else if (dependentTypeInst != NULL)
{ {
mGhostDependencies.Add(type); mGhostDependencies.Add(type);
@ -3409,6 +3424,9 @@ void BfContext::MarkUsedModules(BfProject* project, BfModule* module)
{ {
BP_ZONE("BfContext::MarkUsedModules"); BP_ZONE("BfContext::MarkUsedModules");
if (module->mIsDeleting)
return;
BF_ASSERT_REL(!module->mIsDeleting); BF_ASSERT_REL(!module->mIsDeleting);
if (module->mIsScratchModule) if (module->mIsScratchModule)

View file

@ -503,6 +503,7 @@ public:
void RebuildDependentTypes(BfDependedType* dType); void RebuildDependentTypes(BfDependedType* dType);
void QueueMidCompileRebuildDependentTypes(BfDependedType* dType, const String& reason); void QueueMidCompileRebuildDependentTypes(BfDependedType* dType, const String& reason);
void RebuildDependentTypes_MidCompile(BfDependedType* dType, const String& reason); void RebuildDependentTypes_MidCompile(BfDependedType* dType, const String& reason);
bool IsRebuilding(BfType* type);
bool CanRebuild(BfType* type); bool CanRebuild(BfType* type);
void TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChange); void TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChange);
void TypeMethodSignaturesChanged(BfTypeInstance* typeInst); void TypeMethodSignaturesChanged(BfTypeInstance* typeInst);

View file

@ -449,7 +449,8 @@ enum BfTypeRebuildFlags
BfTypeRebuildFlag_RebuildQueued = 0x20000, BfTypeRebuildFlag_RebuildQueued = 0x20000,
BfTypeRebuildFlag_ConstEvalCancelled = 0x40000, BfTypeRebuildFlag_ConstEvalCancelled = 0x40000,
BfTypeRebuildFlag_ChangedMidCompile = 0x80000, BfTypeRebuildFlag_ChangedMidCompile = 0x80000,
BfTypeRebuildFlag_PendingGenericArgDep = 0x100000 BfTypeRebuildFlag_PendingGenericArgDep = 0x100000,
BfTypeRebuildFlag_InRebuildType = 0x200000
}; };
class BfTypeDIReplaceCallback; class BfTypeDIReplaceCallback;