From c6150c850e698dcfa98d8b9988d05a7bd41288e4 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 29 Jun 2023 07:48:11 -0400 Subject: [PATCH] Made ResolveTypeRef failure more robust --- IDEHelper/Compiler/BfModule.cpp | 29 +++++++++++++++++++--- IDEHelper/Compiler/BfModule.h | 3 ++- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 31 +++++------------------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 74a266e4..8f702519 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/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()); diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 0a888598..9f20adee 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/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); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 612f8b88..e523822a 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/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); }