Explorar el Código

Recursive type rebuild fix

Brian Fiete hace 7 meses
padre
commit
9d8647cd84

+ 18 - 0
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)

+ 1 - 0
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);

+ 2 - 1
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;