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:
parent
247eb0abdc
commit
c6150c850e
3 changed files with 33 additions and 30 deletions
|
@ -3195,7 +3195,7 @@ BfError* BfModule::Fail(const StringImpl& error, BfAstNode* refNode, bool isPers
|
||||||
if (mCurTypeInstance != NULL)
|
if (mCurTypeInstance != NULL)
|
||||||
AddFailType(mCurTypeInstance);
|
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;
|
String errorString = error;
|
||||||
BfWhileSpecializingFlags isWhileSpecializing = BfWhileSpecializingFlag_None;
|
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);
|
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 sHadFatalError = false;
|
||||||
static bool sHadReentrancy = false;
|
static bool sHadReentrancy = false;
|
||||||
|
@ -3518,7 +3518,11 @@ void BfModule::FatalError(const StringImpl& error, const char* file, int line)
|
||||||
String fullError = error;
|
String fullError = error;
|
||||||
|
|
||||||
if (file != NULL)
|
if (file != NULL)
|
||||||
|
{
|
||||||
fullError += StrFormat(" at %s:%d", file, line);
|
fullError += StrFormat(" at %s:%d", file, line);
|
||||||
|
if (column != -1)
|
||||||
|
fullError += StrFormat(":%d", column);
|
||||||
|
}
|
||||||
|
|
||||||
fullError += StrFormat("\nModule: %s", mModuleName.c_str());
|
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");
|
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)
|
void BfModule::InternalError(const StringImpl& error, BfAstNode* refNode, const char* file, int line)
|
||||||
{
|
{
|
||||||
String fullError = error;
|
String fullError = error;
|
||||||
|
@ -5666,7 +5687,7 @@ void BfModule::EncodeAttributeData(BfTypeInstance* typeInstance, BfType* argType
|
||||||
EncodeAttributeData(typeInstance, argType, BfIRValue(BfIRValueFlags_Const, bitcast->mTarget), data, usedStringIdMap);
|
EncodeAttributeData(typeInstance, argType, BfIRValue(BfIRValueFlags_Const, bitcast->mTarget), data, usedStringIdMap);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSH_INT8(constant->mTypeCode);
|
PUSH_INT8(constant->mTypeCode);
|
||||||
if ((constant->mTypeCode == BfTypeCode_Int64) ||
|
if ((constant->mTypeCode == BfTypeCode_Int64) ||
|
||||||
(constant->mTypeCode == BfTypeCode_UInt64) ||
|
(constant->mTypeCode == BfTypeCode_UInt64) ||
|
||||||
|
@ -5708,7 +5729,7 @@ void BfModule::EncodeAttributeData(BfTypeInstance* typeInstance, BfType* argType
|
||||||
for (int i = 0; i < argType->mSize; i++)
|
for (int i = 0; i < argType->mSize; i++)
|
||||||
data.Add(0);
|
data.Add(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// else if (constant->mConstType == BfConstType_Agg)
|
// else if (constant->mConstType == BfConstType_Agg)
|
||||||
// {
|
// {
|
||||||
// BF_ASSERT(argType->IsComposite());
|
// BF_ASSERT(argType->IsComposite());
|
||||||
|
|
|
@ -1604,7 +1604,8 @@ public:
|
||||||
bool mHadHotObjectWrites;
|
bool mHadHotObjectWrites;
|
||||||
|
|
||||||
public:
|
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 InternalError(const StringImpl& error, BfAstNode* refNode = NULL, const char* file = NULL, int line = -1);
|
||||||
void NotImpl(BfAstNode* astNode);
|
void NotImpl(BfAstNode* astNode);
|
||||||
void AddMethodReference(const BfMethodRef& methodRef, BfGetMethodInstanceFlags flags = BfGetMethodInstanceFlag_None);
|
void AddMethodReference(const BfMethodRef& methodRef, BfGetMethodInstanceFlags flags = BfGetMethodInstanceFlag_None);
|
||||||
|
|
|
@ -11563,16 +11563,19 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defer({
|
||||||
|
if (resolvedEntry->mValue == NULL)
|
||||||
|
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
||||||
|
});
|
||||||
|
|
||||||
if ((lookupCtx.mIsUnboundGeneric) && (lookupCtx.mRootTypeDef != NULL))
|
if ((lookupCtx.mIsUnboundGeneric) && (lookupCtx.mRootTypeDef != NULL))
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, ResolveTypeDef(lookupCtx.mRootTypeDef), populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, ResolveTypeDef(lookupCtx.mRootTypeDef), populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)
|
if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
return ResolveTypeResult(typeRef, resolvedEntry, populateType, resolveFlags);
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BfModule* populateModule = this;
|
BfModule* populateModule = this;
|
||||||
|
@ -11619,7 +11622,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
Fail("Expected generic argument", typeRef);
|
Fail("Expected generic argument", typeRef);
|
||||||
else
|
else
|
||||||
Fail(StrFormat("Expected %d generic arguments", wantedGenericParams), typeRef);
|
Fail(StrFormat("Expected %d generic arguments", wantedGenericParams), typeRef);
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11681,7 +11683,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
{
|
{
|
||||||
Fail("Generic type arguments expected", typeRef);
|
Fail("Generic type arguments expected", typeRef);
|
||||||
delete typeInst;
|
delete typeInst;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
resolvedEntry->mValue = typeInst;
|
resolvedEntry->mValue = typeInst;
|
||||||
|
@ -11708,7 +11709,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if (arrayTypeRef->mDimensions > 4)
|
if (arrayTypeRef->mDimensions > 4)
|
||||||
{
|
{
|
||||||
Fail("Too many array dimensions, consider using a jagged array.", arrayTypeRef);
|
Fail("Too many array dimensions, consider using a jagged array.", arrayTypeRef);
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11716,7 +11716,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
auto arrayTypeDef = mCompiler->GetArrayTypeDef(arrayTypeRef->mDimensions);
|
auto arrayTypeDef = mCompiler->GetArrayTypeDef(arrayTypeRef->mDimensions);
|
||||||
if ((elementType == NULL) || (arrayTypeDef == NULL))
|
if ((elementType == NULL) || (arrayTypeDef == NULL))
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11839,7 +11838,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if (typeDef == NULL)
|
if (typeDef == NULL)
|
||||||
{
|
{
|
||||||
Fail("Unable to resolve type", typeRef);
|
Fail("Unable to resolve type", typeRef);
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
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));
|
genericArg = ResolveTypeRef(genericArgRef, NULL, BfPopulateType_Identity, (BfResolveTypeRefFlags)(BfResolveTypeRefFlag_AllowGenericTypeParamConstValue | BfResolveTypeRefFlag_AllowGenericMethodParamConstValue));
|
||||||
if ((genericArg == NULL) || (genericArg->IsVar()))
|
if ((genericArg == NULL) || (genericArg->IsVar()))
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, ((genericArg != NULL) && (genericArg->IsVar())) ? genericArg : NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, ((genericArg != NULL) && (genericArg->IsVar())) ? genericArg : NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
genericArgs.Add(genericArg);
|
genericArgs.Add(genericArg);
|
||||||
|
@ -11891,12 +11888,10 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if ((type != NULL) &&
|
if ((type != NULL) &&
|
||||||
((type->IsDelegateFromTypeRef()) || (type->IsFunctionFromTypeRef())))
|
((type->IsDelegateFromTypeRef()) || (type->IsFunctionFromTypeRef())))
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveGenericType(type, &genericArgs, NULL, mCurTypeInstance);
|
return ResolveGenericType(type, &genericArgs, NULL, mCurTypeInstance);
|
||||||
}
|
}
|
||||||
else if ((type != NULL) && (type->IsTuple()))
|
else if ((type != NULL) && (type->IsTuple()))
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveGenericType(type, &genericArgs, NULL, mCurTypeInstance);
|
return ResolveGenericType(type, &genericArgs, NULL, mCurTypeInstance);
|
||||||
}
|
}
|
||||||
else if ((typeDef != NULL) && (typeDef->mTypeCode == BfTypeCode_TypeAlias))
|
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);
|
Fail("Not a generic type", typeRef);
|
||||||
delete genericTypeInst;
|
delete genericTypeInst;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11957,7 +11951,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
innerWantedGenericParams -= (int)typeDef->mOuterType->mGenericParamDefs.size();
|
innerWantedGenericParams -= (int)typeDef->mOuterType->mGenericParamDefs.size();
|
||||||
ShowGenericArgCountError(genericTypeInstRef, innerWantedGenericParams);
|
ShowGenericArgCountError(genericTypeInstRef, innerWantedGenericParams);
|
||||||
delete genericTypeInst;
|
delete genericTypeInst;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11976,7 +11969,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
{
|
{
|
||||||
Fail("Maximum generic depth exceeded", typeRef);
|
Fail("Maximum generic depth exceeded", typeRef);
|
||||||
delete genericTypeInst;
|
delete genericTypeInst;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12017,10 +12009,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
BfTypeReference* typeRef = tupleTypeRef->mFieldTypes[fieldIdx];
|
BfTypeReference* typeRef = tupleTypeRef->mFieldTypes[fieldIdx];
|
||||||
auto type = ResolveTypeRef(typeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
|
auto type = ResolveTypeRef(typeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
|
||||||
if (type == NULL)
|
if (type == NULL)
|
||||||
{
|
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
|
||||||
|
|
||||||
String fieldName;
|
String fieldName;
|
||||||
BfIdentifierNode* identifierNode = NULL;
|
BfIdentifierNode* identifierNode = NULL;
|
||||||
|
@ -12038,7 +12027,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
isUnspecialized = true;
|
isUnspecialized = true;
|
||||||
if (type->IsVar())
|
if (type->IsVar())
|
||||||
{
|
{
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
types.push_back(type);
|
types.push_back(type);
|
||||||
|
@ -12127,10 +12115,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
|
|
||||||
auto elementType = ResolveTypeRef(elementTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
|
auto elementType = ResolveTypeRef(elementTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowGenericParamConstValue);
|
||||||
if ((elementType == NULL) || (elementType->IsVar()))
|
if ((elementType == NULL) || (elementType->IsVar()))
|
||||||
{
|
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
|
||||||
}
|
|
||||||
|
|
||||||
BfTypeInstance* genericTypeInst = new BfTypeInstance();
|
BfTypeInstance* genericTypeInst = new BfTypeInstance();
|
||||||
genericTypeInst->mGenericTypeInfo = new BfGenericTypeInfo();
|
genericTypeInst->mGenericTypeInfo = new BfGenericTypeInfo();
|
||||||
|
@ -12163,7 +12148,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if ((elementType == NULL) || (elementType->IsVar()))
|
if ((elementType == NULL) || (elementType->IsVar()))
|
||||||
{
|
{
|
||||||
delete pointerType;
|
delete pointerType;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12194,7 +12178,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if ((elementType == NULL) || (elementType->IsVar()))
|
if ((elementType == NULL) || (elementType->IsVar()))
|
||||||
{
|
{
|
||||||
delete refType;
|
delete refType;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, elementType, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12477,7 +12460,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if (failed)
|
if (failed)
|
||||||
{
|
{
|
||||||
delete delegateType;
|
delete delegateType;
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12551,7 +12533,6 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if ((mCurTypeInstance != NULL) && (mCurTypeInstance->mDependencyMap.mMinDependDepth > 32))
|
if ((mCurTypeInstance != NULL) && (mCurTypeInstance->mDependencyMap.mMinDependDepth > 32))
|
||||||
{
|
{
|
||||||
Fail("Generic type dependency depth exceeded", typeRef);
|
Fail("Generic type dependency depth exceeded", typeRef);
|
||||||
mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
|
|
||||||
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, NULL, populateType, resolveFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue