|
@@ -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)
|