Browse Source

Fixed dependency of alias types

Brian Fiete 3 years ago
parent
commit
c6a7af2a4b

+ 0 - 5
IDEHelper/Compiler/BfCodeGen.cpp

@@ -411,11 +411,6 @@ void BfCodeGenThread::RunLoop()
 #endif
 #endif
 
 
 #endif
 #endif
-			if (request->mOutFileName.Contains("RuntimeThreadInit"))
-			{
-				NOP;
-			}
-
 			if ((hasCacheMatch) || (!errorMsg.IsEmpty()))
 			if ((hasCacheMatch) || (!errorMsg.IsEmpty()))
 			{
 			{
 				//
 				//

+ 17 - 6
IDEHelper/Compiler/BfModule.cpp

@@ -3497,7 +3497,7 @@ bool BfModule::CheckDefineMemberProtection(BfProtection protection, BfType* memb
 	return true;
 	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)
 	if (usedType == userType)
 		return;	
 		return;	
@@ -3650,12 +3650,23 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap
 
 
 	if (usedType->IsTypeAlias())
 	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();
 		auto underlyingType = usedType->GetUnderlyingType();
 		if (underlyingType != NULL)
 		if (underlyingType != NULL)

+ 1 - 1
IDEHelper/Compiler/BfModule.h

@@ -1758,7 +1758,7 @@ public:
 	bool CheckAccessMemberProtection(BfProtection protection, BfTypeInstance* memberType);
 	bool CheckAccessMemberProtection(BfProtection protection, BfTypeInstance* memberType);
 	bool CheckDefineMemberProtection(BfProtection protection, BfType* memberType);	
 	bool CheckDefineMemberProtection(BfProtection protection, BfType* memberType);	
 	void CheckMemberNames(BfTypeInstance* typeInst);	
 	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 AddDependency(BfGenericParamInstance* genericParam, BfTypeInstance* usingType);
 	void AddCallDependency(BfMethodInstance* methodInstance, bool devirtualized = false);
 	void AddCallDependency(BfMethodInstance* methodInstance, bool devirtualized = false);
 	void AddFieldDependency(BfTypeInstance* typeInstance, BfFieldInstance* fieldInstance, BfType* fieldType);		
 	void AddFieldDependency(BfTypeInstance* typeInstance, BfFieldInstance* fieldInstance, BfType* fieldType);		

+ 13 - 0
IDEHelper/Compiler/BfResolvedTypeUtils.h

@@ -160,6 +160,19 @@ public:
 	TypeMap::iterator erase(TypeMap::iterator& itr);	
 	TypeMap::iterator erase(TypeMap::iterator& itr);	
 };
 };
 
 
+class BfDepContext
+{
+public:
+	HashSet<BfType*> mDeepSeenAliases;
+	int mAliasDepth;
+
+public:
+	BfDepContext()
+	{
+		mAliasDepth = 0;
+	}
+};
+
 enum BfHotDepDataKind : int8
 enum BfHotDepDataKind : int8
 {
 {
 	BfHotDepDataKind_Unknown,
 	BfHotDepDataKind_Unknown,