Răsfoiți Sursa

Made ResolveTypeRef failure more robust

Brian Fiete 2 ani în urmă
părinte
comite
c6150c850e

+ 25 - 4
IDEHelper/Compiler/BfModule.cpp

@@ -3195,7 +3195,7 @@ BfError* BfModule::Fail(const StringImpl& error, BfAstNode* refNode, bool isPers
 	if (mCurTypeInstance != NULL)
 		AddFailType(mCurTypeInstance);
 
-	BfLogSysM("BfModule::Fail module %p type %p %s\n", this, mCurTypeInstance, error.c_str());
+	BfLogSysM("BfModule::Fail module %p type %p %s @ %s\n", this, mCurTypeInstance, error.c_str(), (refNode != NULL) ? refNode->LocationToString().c_str() : "???");
 
  	String errorString = error;
 	BfWhileSpecializingFlags isWhileSpecializing = BfWhileSpecializingFlag_None;
@@ -3503,7 +3503,7 @@ void BfModule::CheckRangeError(BfType* type, BfAstNode* refNode)
 		Fail(StrFormat("Result out of range for type '%s'", TypeToString(type).c_str()), refNode);
 }
 
-void BfModule::FatalError(const StringImpl& error, const char* file, int line)
+void BfModule::FatalError(const StringImpl& error, const char* file, int line, int column)
 {
 	static bool sHadFatalError = false;
 	static bool sHadReentrancy = false;
@@ -3518,7 +3518,11 @@ void BfModule::FatalError(const StringImpl& error, const char* file, int line)
 	String fullError = error;
 
 	if (file != NULL)
+	{
 		fullError += StrFormat(" at %s:%d", file, line);
+		if (column != -1)
+			fullError += StrFormat(":%d", column);
+	}
 
 	fullError += StrFormat("\nModule: %s", mModuleName.c_str());
 
@@ -3536,6 +3540,23 @@ void BfModule::FatalError(const StringImpl& error, const char* file, int line)
 	BfpSystem_FatalError(fullError.c_str(), "FATAL MODULE ERROR");
 }
 
+void BfModule::FatalError(const StringImpl& error, BfAstNode* refNode)
+{
+	if (refNode != NULL)
+	{
+		auto parser = refNode->GetParserData();
+		if (parser != NULL)
+		{
+			int line = -1;
+			int lineChar = -1;
+			parser->GetLineCharAtIdx(refNode->mSrcStart, line, lineChar);
+			if (line != -1)
+				FatalError(error, parser->mFileName.c_str(), line, lineChar);
+		}
+	}
+	FatalError(error);
+}
+
 void BfModule::InternalError(const StringImpl& error, BfAstNode* refNode, const char* file, int line)
 {
 	String fullError = error;
@@ -5666,7 +5687,7 @@ void BfModule::EncodeAttributeData(BfTypeInstance* typeInstance, BfType* argType
 		EncodeAttributeData(typeInstance, argType, BfIRValue(BfIRValueFlags_Const, bitcast->mTarget), data, usedStringIdMap);
 		return;
 	}
-	
+
 	PUSH_INT8(constant->mTypeCode);
 	if ((constant->mTypeCode == BfTypeCode_Int64) ||
 		(constant->mTypeCode == BfTypeCode_UInt64) ||
@@ -5708,7 +5729,7 @@ void BfModule::EncodeAttributeData(BfTypeInstance* typeInstance, BfType* argType
 		for (int i = 0; i < argType->mSize; i++)
 			data.Add(0);
 	}
-	
+
 // 	else if (constant->mConstType == BfConstType_Agg)
 // 	{
 // 		BF_ASSERT(argType->IsComposite());

+ 2 - 1
IDEHelper/Compiler/BfModule.h

@@ -1604,7 +1604,8 @@ public:
 	bool mHadHotObjectWrites;
 
 public:
-	void FatalError(const StringImpl& error, const char* file = NULL, int line = -1);
+	void FatalError(const StringImpl& error, const char* file = NULL, int line = -1, int column = -1);
+	void FatalError(const StringImpl& error, BfAstNode* refNode);
 	void InternalError(const StringImpl& error, BfAstNode* refNode = NULL, const char* file = NULL, int line = -1);
 	void NotImpl(BfAstNode* astNode);
 	void AddMethodReference(const BfMethodRef& methodRef, BfGetMethodInstanceFlags flags = BfGetMethodInstanceFlag_None);

+ 6 - 25
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -11563,16 +11563,19 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags);
 	}
 
+	defer({
+		if (resolvedEntry->mValue == NULL)
+			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
+		});
+
 	if ((lookupCtx.mIsUnboundGeneric) && (lookupCtx.mRootTypeDef != NULL))
 	{
-		mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 		return ResolveTypeResult(typeRef, ResolveTypeDef(lookupCtx.mRootTypeDef), populateType, resolveFlags);
 	}
 
 	if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)
 	{
-		mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
-		return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
+		return ResolveTypeResult(typeRef, resolvedEntry, populateType, resolveFlags);
 	}
 
 	BfModule* populateModule = this;
@@ -11619,7 +11622,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 						Fail("Expected generic argument", typeRef);
 					else
 						Fail(StrFormat("Expected %d generic arguments", wantedGenericParams), typeRef);
-					mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 					return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 				}
 
@@ -11681,7 +11683,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		{
 			Fail("Generic type arguments expected", typeRef);
 			delete typeInst;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 		resolvedEntry->mValue = typeInst;
@@ -11708,7 +11709,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if (arrayTypeRef->mDimensions > 4)
 		{
 			Fail("Too many array dimensions, consider using a jagged array.", arrayTypeRef);
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -11716,7 +11716,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		auto arrayTypeDef = mCompiler->GetArrayTypeDef(arrayTypeRef->mDimensions);
 		if ((elementType == NULL) || (arrayTypeDef == NULL))
 		{
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -11839,7 +11838,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if (typeDef == NULL)
 		{
 			Fail("Unable to resolve type", typeRef);
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -11881,7 +11879,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 				genericArg = ResolveTypeRef(genericArgRef, NULL, BfPopulateType_Identity, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_AllowGenericTypeParamConstValue | BfResolveTypeRefFlag_AllowGenericMethodParamConstValue));
 			if ((genericArg == NULL) || (genericArg->IsVar()))
 			{
-				mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 				return ResolveTypeResult(typeRef, ((genericArg != NULL) && (genericArg->IsVar())) ? genericArg : NULL, populateType, resolveFlags);
 			}
 			genericArgs.Add(genericArg);
@@ -11891,12 +11888,10 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if ((type != NULL) &&
 			((type->IsDelegateFromTypeRef()) || (type->IsFunctionFromTypeRef())))
 		{
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveGenericType(type, &genericArgs, NULL, mCurTypeInstance);
 		}
 		else if ((type != NULL) && (type->IsTuple()))
 		{
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveGenericType(type, &genericArgs, NULL, mCurTypeInstance);
 		}
 		else if ((typeDef != NULL) && (typeDef->mTypeCode == BfTypeCode_TypeAlias))
@@ -11922,7 +11917,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		{
 			Fail("Not a generic type", typeRef);
 			delete genericTypeInst;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -11957,7 +11951,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 				innerWantedGenericParams -= (int)typeDef->mOuterType->mGenericParamDefs.size();
 			ShowGenericArgCountError(genericTypeInstRef, innerWantedGenericParams);
 			delete genericTypeInst;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -11976,7 +11969,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		{
 			Fail("Maximum generic depth exceeded", typeRef);
 			delete genericTypeInst;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -12017,10 +12009,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 			BfTypeReference* typeRef = tupleTypeRef->mFieldTypes[fieldIdx];
 			auto type = ResolveTypeRef(typeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
 			if (type == NULL)
-			{
-				mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 				return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
-			}
 
 			String fieldName;
 			BfIdentifierNode* identifierNode = NULL;
@@ -12038,7 +12027,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 				isUnspecialized = true;
 			if (type->IsVar())
 			{
-				mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 				return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 			}
 			types.push_back(type);
@@ -12127,10 +12115,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 
 		auto elementType = ResolveTypeRef(elementTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
 		if ((elementType == NULL) || (elementType->IsVar()))
-		{
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
-		}
 
 		BfTypeInstance* genericTypeInst = new BfTypeInstance();
 		genericTypeInst->mGenericTypeInfo = new BfGenericTypeInfo();
@@ -12163,7 +12148,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if ((elementType == NULL) || (elementType->IsVar()))
 		{
 			delete pointerType;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
 		}
 
@@ -12194,7 +12178,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if ((elementType == NULL) || (elementType->IsVar()))
 		{
 			delete refType;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
 		}
 
@@ -12477,7 +12460,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if (failed)
 		{
 			delete delegateType;
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}
 
@@ -12551,7 +12533,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		if ((mCurTypeInstance != NULL) && (mCurTypeInstance->mDependencyMap.mMinDependDepth > 32))
 		{
 			Fail("Generic type dependency depth exceeded", typeRef);
-			mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 			return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
 		}