소스 검색

Improved mid-compile deleted type handling

Brian Fiete 5 달 전
부모
커밋
4ba8f6b0f6

+ 1 - 0
IDEHelper/Compiler/BfCompiler.h

@@ -74,6 +74,7 @@ public:
 		int mQueuedTypesProcessed;
 		int mTypesQueued;
 		int mTypesDeleted;
+		int mTypesDeleted_LastUpdateAfterDeletingTypes;
 		int mMethodsQueued;
 
 		int mModulesStarted;

+ 11 - 1
IDEHelper/Compiler/BfContext.cpp

@@ -2036,9 +2036,10 @@ void BfContext::DeleteType(BfType* type, bool deferDepRebuilds)
 void BfContext::UpdateAfterDeletingTypes()
 {
 	BP_ZONE("BfContext::UpdateAfterDeletingTypes");
-	BfLogSysM("UpdateAfterDeletingTypes\n");
+	BfLogSysM("UpdateAfterDeletingTypes\n");	
 
 	int graveyardStart = (int)mTypeGraveyard.size();
+	
 
 	while (true)
 	{
@@ -2124,6 +2125,8 @@ void BfContext::UpdateAfterDeletingTypes()
 			SaveDeletingType(type);
 		}
 	}
+
+	mCompiler->mStats.mTypesDeleted_LastUpdateAfterDeletingTypes = mCompiler->mStats.mTypesDeleted;
 }
 
 // This happens before the old defs have been injected
@@ -3487,6 +3490,13 @@ void BfContext::Cleanup()
 
 	mCompiler->mCompileState = BfCompiler::CompileState_Cleanup;
 
+	if (mCompiler->mStats.mTypesDeleted_LastUpdateAfterDeletingTypes != mCompiler->mStats.mTypesDeleted)
+	{
+		// Should only occur for internal compiler errors
+		BF_ASSERT(mCompiler->mExtraCompileRequested);
+		UpdateAfterDeletingTypes();
+	}
+
 	///
 	{
 		Array<BfLocalMethod*> survivingLocalMethods;

+ 7 - 1
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -9508,8 +9508,14 @@ BfTypedValue BfExprEvaluator::CheckEnumCreation(BfAstNode* targetSrc, BfTypeInst
 
 				BfTypedValue receivingValue;
 				BfIRValue tupleFieldPtr;
-				if (tuplePtr)
+
+				mModule->PopulateType(tupleFieldInstance->mResolvedType);
+				if (tupleFieldInstance->mResolvedType->IsValuelessType())
 				{
+					receivingValue = mModule->GetDefaultTypedValue(tupleFieldInstance->mResolvedType);
+				}
+				else if (tuplePtr)
+				{					
 					tupleFieldPtr = mModule->mBfIRBuilder->CreateInBoundsGEP(tuplePtr, 0, tupleFieldInstance->mDataIdx);
 					receivingValue = BfTypedValue(tupleFieldPtr, tupleFieldInstance->mResolvedType, true);
 				}

+ 13 - 3
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -7791,17 +7791,27 @@ BfUnknownSizedArrayType* BfModule::CreateUnknownSizedArrayType(BfType* resolvedT
 BfPointerType* BfModule::CreatePointerType(BfType* resolvedType)
 {
 	BF_ASSERT(!resolvedType->IsVar());
-	BF_ASSERT_REL(!resolvedType->IsDeleting());
-
+	
 	auto pointerType = mContext->mPointerTypePool.Get();
 	pointerType->mContext = mContext;
 	pointerType->mElementType = resolvedType;
 	auto resolvedPointerType = (BfPointerType*)ResolveType(pointerType);
 	if (resolvedPointerType != pointerType)
+	{
 		mContext->mPointerTypePool.GiveBack(pointerType);
+	}
+	else
+	{
+		if (resolvedType->IsDeleting())
+		{
+			mCompiler->RequestExtraCompile();
+			InternalError("CreatePointerType using deleted type");
+			mContext->DeleteType(resolvedPointerType);
+		}
+	}
 
 	BF_ASSERT(resolvedPointerType->mElementType == resolvedType);
-
+	
 	return resolvedPointerType;
 }
 

+ 7 - 0
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -2947,6 +2947,13 @@ BfTypedValue BfModule::TryCaseEnumMatch(BfTypedValue enumVal, BfTypedValue tagVa
 			PopulateType(tupleType);
 			mBfIRBuilder->PopulateType(tupleType);
 
+			if (tupleType->IsDeleting())
+			{
+				mCompiler->RequestExtraCompile();
+				InternalError("TryCaseEnumMatch using deleted type", expr);
+				return BfTypedValue();
+			}
+
 			auto boolType = GetPrimitiveType(BfTypeCode_Boolean);
 			tagId = -fieldInstance->mDataIdx - 1;