From 6f51eca72c203a3d1c49cb2cdcc77fd32aca21d6 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 5 Jun 2022 17:46:28 -0700 Subject: [PATCH] Perform PopulateReified pass after ProcessPurgatory --- IDEHelper/Compiler/BfCompiler.cpp | 24 ++++++++++++++++++------ IDEHelper/Compiler/BfCompiler.h | 2 +- IDEHelper/Compiler/BfModule.cpp | 3 +++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 1f3aea5e..df43e3c1 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -2574,10 +2574,12 @@ void BfCompiler::SanitizeDependencyMap() // 1) It gets built on demand // 2) It gets deleted in UpdateDependencyMap // 3) It stays undefined and we need to build it here -void BfCompiler::ProcessPurgatory(bool reifiedOnly) +bool BfCompiler::ProcessPurgatory(bool reifiedOnly) { BP_ZONE("BfCompiler::ProcessPurgatory"); + bool didWork = false; + while (true) { mContext->RemoveInvalidWorkItems(); @@ -2614,10 +2616,12 @@ void BfCompiler::ProcessPurgatory(bool reifiedOnly) mGenericInstancePurgatory.Clear(); int prevPurgatorySize = (int)mGenericInstancePurgatory.size(); - mContext->ProcessWorkList(reifiedOnly, reifiedOnly); + if (mContext->ProcessWorkList(reifiedOnly, reifiedOnly)) + didWork = true; if (prevPurgatorySize == (int)mGenericInstancePurgatory.size()) break; } + return didWork; } bool BfCompiler::VerifySlotNums() @@ -7259,10 +7263,18 @@ bool BfCompiler::DoCompile(const StringImpl& outputDirectory) BfLogSysM("DoCompile looping over CompileReified due to mHasReifiedQueuedRebuildTypes\n"); } - - ProcessPurgatory(true); - if (mOptions.mCompileOnDemandKind != BfCompileOnDemandKind_AlwaysInclude) - DoWorkLoop(); + + // Handle purgatory (ie: old generic types) + { + bool didWork = ProcessPurgatory(true); + if (mOptions.mCompileOnDemandKind != BfCompileOnDemandKind_AlwaysInclude) + { + if (DoWorkLoop()) + didWork = true; + if (didWork) + PopulateReified(); + } + } // Mark used modules if ((mOptions.mCompileOnDemandKind != BfCompileOnDemandKind_AlwaysInclude) && (!mCanceling)) diff --git a/IDEHelper/Compiler/BfCompiler.h b/IDEHelper/Compiler/BfCompiler.h index c980a0bf..c598e2a9 100644 --- a/IDEHelper/Compiler/BfCompiler.h +++ b/IDEHelper/Compiler/BfCompiler.h @@ -481,7 +481,7 @@ public: void CreateVData(BfVDataModule* bfModule); void UpdateDependencyMap(bool deleteUnusued, bool& didWork); void SanitizeDependencyMap(); - void ProcessPurgatory(bool reifiedOnly); + bool ProcessPurgatory(bool reifiedOnly); bool VerifySlotNums(); bool QuickGenerateSlotNums(); bool SlowGenerateSlotNums(); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5fef1db5..80e18e3c 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -6423,6 +6423,7 @@ BfIRValue BfModule::CreateTypeData(BfType* type, Dictionary& usedStrin if ((methodInstance != NULL) && (!methodInstance->mMethodDef->mIsAbstract)) { BF_ASSERT(methodInstance->mIsReified); + // This doesn't work because we may have FOREIGN methods from implicit interface methods //auto moduleMethodInst = GetMethodInstanceAtIdx(methodRef.mTypeInstance, methodRef.mMethodNum); auto moduleMethodInst = ReferenceExternalMethodInstance(methodInstance, BfGetMethodInstanceFlag_NoInline); @@ -13911,6 +13912,8 @@ BfModuleMethodInstance BfModule::GetMethodInstance(BfTypeInstance* typeInst, BfM auto _SetReified = [&]() { + if (!mCompiler->mIsResolveOnly) + BF_ASSERT(mCompiler->mCompileState <= BfCompiler::CompileState_Normal); methodInstance->mIsReified = true; };