From 06a073d0e732f962c1adbe36c26909f70468bafe Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 26 Feb 2021 06:27:01 -0800 Subject: [PATCH] More robust handling of missing system types --- IDEHelper/Compiler/BfCompiler.cpp | 18 +++++++++++------- IDEHelper/Compiler/BfContext.cpp | 6 ++++-- IDEHelper/Compiler/BfModule.cpp | 7 +++++-- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 7 +++---- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 1bd87e39..fdd610cf 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -3001,12 +3001,14 @@ void BfCompiler::UpdateRevisedTypes() // { BfAtomComposite objectName; - mSystem->ParseAtomComposite("System.Object", objectName); - for (auto itr = mSystem->mTypeDefs.TryGet(objectName); itr != mSystem->mTypeDefs.end(); ++itr) + if (mSystem->ParseAtomComposite("System.Object", objectName)) { - BfTypeDef* typeDef = *itr; - if ((typeDef->mFullName == objectName) && (typeDef->mTypeCode == BfTypeCode_Object)) - corlibProjects.Add(typeDef->mProject); + for (auto itr = mSystem->mTypeDefs.TryGet(objectName); itr != mSystem->mTypeDefs.end(); ++itr) + { + BfTypeDef* typeDef = *itr; + if ((typeDef->mFullName == objectName) && (typeDef->mTypeCode == BfTypeCode_Object)) + corlibProjects.Add(typeDef->mProject); + } } } @@ -6742,7 +6744,8 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory) mSystem->CheckLockYield(); - mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef); + if (mBfObjectTypeDef != NULL) + mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef); VisitSourceExteriorNodes(); if (!mIsResolveOnly) @@ -6827,7 +6830,8 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory) // { - mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef, BfPopulateType_Full); + if (mBfObjectTypeDef != NULL) + mContext->mScratchModule->ResolveTypeDef(mBfObjectTypeDef, BfPopulateType_Full); mContext->RemapObject(); diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index 84a13720..919743f9 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -2723,8 +2723,10 @@ void BfContext::RemoveInvalidWorkItems() } void BfContext::RemapObject() -{ - +{ + if (mCompiler->mBfObjectTypeDef == NULL) + return; + // There are several types that get their LLVM type mapped to Object, so make sure to remap that // for when Object itself gets recreated diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5908bfbd..e654e534 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -2567,7 +2567,8 @@ void BfModule::UpdateExprSrcPos(BfAstNode* astNode, BfSrcPosFlags flags) void BfModule::UseDefaultSrcPos(BfSrcPosFlags flags, int debugLocOffset) { - UpdateSrcPos(mCompiler->mBfObjectTypeDef->mTypeDeclaration, flags, debugLocOffset); + if (mCompiler->mBfObjectTypeDef != NULL) + UpdateSrcPos(mCompiler->mBfObjectTypeDef->mTypeDeclaration, flags, debugLocOffset); SetIllegalSrcPos(); } @@ -19524,7 +19525,9 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup) mBfIRBuilder->ClearDebugLocation(); PopulateType(mCurTypeInstance, BfPopulateType_Data); auto thisVal = GetThis(); - int prevSize = mContext->mBfObjectType->mInstSize; + int prevSize = 0; + if (mContext->mBfObjectType != NULL) + prevSize = mContext->mBfObjectType->mInstSize; int curSize = mCurTypeInstance->mInstSize; if (curSize > prevSize) { diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 78f1c52a..6d51af93 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1312,9 +1312,8 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType case BfTypeCode_Var: case BfTypeCode_Let: { - auto objType = mContext->mBfObjectType; - primitiveType->mSize = objType->mSize; - primitiveType->mAlign = objType->mAlign; + primitiveType->mSize = mSystem->mPtrSize; + primitiveType->mAlign = mSystem->mPtrSize; resolvedTypeRef->mDefineState = BfTypeDefineState_Defined; } return; @@ -1415,7 +1414,7 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType { if (typeInstance->mTypeDef == mCompiler->mBfObjectTypeDef) mContext->mBfObjectType = typeInstance; - else + else if (mCompiler->mBfObjectTypeDef != NULL) ResolveTypeDef(mCompiler->mBfObjectTypeDef); }