1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 20:12:21 +02:00

Made ResolveTypeRef failure more robust

This commit is contained in:
Brian Fiete 2023-06-29 07:48:11 -04:00
parent 247eb0abdc
commit c6150c850e
3 changed files with 33 additions and 30 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);
}