From c6a7af2a4beefe0d4debc10b628ef1764fbc76fb Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 19 Mar 2022 12:24:56 -0700 Subject: [PATCH] Fixed dependency of alias types --- IDEHelper/Compiler/BfCodeGen.cpp | 5 ----- IDEHelper/Compiler/BfModule.cpp | 23 +++++++++++++++++------ IDEHelper/Compiler/BfModule.h | 2 +- IDEHelper/Compiler/BfResolvedTypeUtils.h | 13 +++++++++++++ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/IDEHelper/Compiler/BfCodeGen.cpp b/IDEHelper/Compiler/BfCodeGen.cpp index cd767442..87e0e140 100644 --- a/IDEHelper/Compiler/BfCodeGen.cpp +++ b/IDEHelper/Compiler/BfCodeGen.cpp @@ -411,11 +411,6 @@ void BfCodeGenThread::RunLoop() #endif #endif - if (request->mOutFileName.Contains("RuntimeThreadInit")) - { - NOP; - } - if ((hasCacheMatch) || (!errorMsg.IsEmpty())) { // diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index c13b9e52..2cbf9d62 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -3497,7 +3497,7 @@ bool BfModule::CheckDefineMemberProtection(BfProtection protection, BfType* memb return true; } -void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap::DependencyFlags flags) +void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap::DependencyFlags flags, BfDepContext* depContext) { if (usedType == userType) return; @@ -3650,12 +3650,23 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap if (usedType->IsTypeAlias()) { - usedType = SafeResolveAliasType((BfTypeAliasType*)usedType); - if (usedType == NULL) - return; - } + auto underlyingType = usedType->GetUnderlyingType(); + if (underlyingType != NULL) + { + BfDepContext newDepContext; + if (depContext == NULL) + depContext = &newDepContext; - if (!usedType->IsGenericTypeInstance()) + if (++depContext->mAliasDepth > 8) + { + if (!depContext->mDeepSeenAliases.Add(underlyingType)) + return; // Circular! + } + + AddDependency(underlyingType, userType, depFlag); + } + } + else if (!usedType->IsGenericTypeInstance()) { auto underlyingType = usedType->GetUnderlyingType(); if (underlyingType != NULL) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 01f9d852..895e066f 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1758,7 +1758,7 @@ public: bool CheckAccessMemberProtection(BfProtection protection, BfTypeInstance* memberType); bool CheckDefineMemberProtection(BfProtection protection, BfType* memberType); void CheckMemberNames(BfTypeInstance* typeInst); - void AddDependency(BfType* usedType, BfType* userType, BfDependencyMap::DependencyFlags flags); + void AddDependency(BfType* usedType, BfType* userType, BfDependencyMap::DependencyFlags flags, BfDepContext* depContext = NULL); void AddDependency(BfGenericParamInstance* genericParam, BfTypeInstance* usingType); void AddCallDependency(BfMethodInstance* methodInstance, bool devirtualized = false); void AddFieldDependency(BfTypeInstance* typeInstance, BfFieldInstance* fieldInstance, BfType* fieldType); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index b4952612..4731604f 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -160,6 +160,19 @@ public: TypeMap::iterator erase(TypeMap::iterator& itr); }; +class BfDepContext +{ +public: + HashSet mDeepSeenAliases; + int mAliasDepth; + +public: + BfDepContext() + { + mAliasDepth = 0; + } +}; + enum BfHotDepDataKind : int8 { BfHotDepDataKind_Unknown,