Просмотр исходного кода

Fixed infinite emit refresh loop with non-deterministic emits

Brian Fiete 3 лет назад
Родитель
Сommit
0de3a62e8b

+ 1 - 0
IDEHelper/Compiler/BfCompiler.cpp

@@ -482,6 +482,7 @@ BfCompiler::BfCompiler(BfSystem* bfSystem, bool isResolveOnly)
 	mContext = new BfContext(this);	
 	mCeMachine = new CeMachine(this);
 	mCurCEExecuteId = -1;
+	mLastMidCompileRefreshRevision = -1;
 }
 
 BfCompiler::~BfCompiler()

+ 1 - 0
IDEHelper/Compiler/BfCompiler.h

@@ -326,6 +326,7 @@ public:
 	BfContext* mContext;
 	BfCodeGen mCodeGen;
 	String mOutputDirectory;
+	int mLastMidCompileRefreshRevision;
 	bool mCanceling;
 	bool mHasRequiredTypes;
 	bool mNeedsFullRefresh;

+ 12 - 1
IDEHelper/Compiler/BfContext.cpp

@@ -1197,7 +1197,18 @@ void BfContext::RebuildDependentTypes_MidCompile(BfDependedType* dType, const St
 	dType->mRebuildFlags = (BfTypeRebuildFlags)(dType->mRebuildFlags | BfTypeRebuildFlag_ChangedMidCompile);
 	int prevDeletedTypes = mCompiler->mStats.mTypesDeleted;
 	if (mCompiler->mIsResolveOnly)
-		mCompiler->mNeedsFullRefresh = true;
+	{
+		if (mCompiler->mLastMidCompileRefreshRevision == mCompiler->mRevision - 1)
+		{
+			// Don't repeatedly full refresh in the case of non-deterministic emits
+		}
+		else
+		{
+			mCompiler->mNeedsFullRefresh = true;
+			mCompiler->mLastMidCompileRefreshRevision = mCompiler->mRevision;
+		}
+
+	}
 	BfLogSysM("Rebuilding dependent types MidCompile Type:%p Reason:%s\n", dType, reason.c_str());
 	RebuildDependentTypes(dType);