From 0720b9ad1a5ac8e10211235e4ffc6a65b98de854 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 27 Mar 2020 06:47:26 -0700 Subject: [PATCH] Fixed dependency issue with type lookups --- IDEHelper/Compiler/BfContext.cpp | 10 ++++++++-- IDEHelper/Compiler/BfExprEvaluator.cpp | 1 + IDEHelper/Compiler/BfModuleTypeUtils.cpp | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index 6ff5d48e..04a99743 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -822,6 +822,9 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild return; } + // We need to verify lookups before we rebuild the type, because a type lookup change needs to count as a TypeDataChanged + VerifyTypeLookups(typeInst); + if (typeInst->mRevision != mCompiler->mRevision) { BfLogSysM("Setting revision. Type: %p Revision: %d\n", typeInst, mCompiler->mRevision); @@ -2069,7 +2072,7 @@ void BfContext::UpdateRevisedTypes() } void BfContext::VerifyTypeLookups(BfTypeInstance* typeInst) -{ +{ for (auto& lookupEntryPair : typeInst->mLookupResults) { BfTypeLookupEntry& lookupEntry = lookupEntryPair.mKey; @@ -2104,7 +2107,10 @@ void BfContext::VerifyTypeLookups(BfTypeInstance* typeInst) } if (isDirty) - { + { + // Clear lookup results to avoid infinite recursion + typeInst->mLookupResults.Clear(); + // We need to treat this lookup as if it changed the whole type signature TypeDataChanged(typeInst, true); TypeMethodSignaturesChanged(typeInst); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 9ec5657c..ab8375ab 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -17673,6 +17673,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod if (resultType->IsNullable()) { auto elementType = resultType->GetUnderlyingType(); + mModule->PopulateType(elementType); if (elementType->IsValuelessType()) { mModule->mBfIRBuilder->PopulateType(resultType); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 5aa0ed09..dc3751aa 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -3350,7 +3350,7 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) { BF_ASSERT(typeInstance->mVirtualMethodTableSize >= (int)typeInstance->mVirtualMethodTable.size()); } - } + } // Add new interfaces for (int iFaceIdx = 0; iFaceIdx < (int)typeInstance->mInterfaces.size(); iFaceIdx++)