From ee8c06225348a9d77fa51e4215b51543fbc7ca4a Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 5 Jan 2021 14:46:40 -0800 Subject: [PATCH] Fixed circular reference inheritance issue with interfaces --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 1b39618d..0ca411f6 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -2712,6 +2712,10 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy for (int iFaceIdx = 0; iFaceIdx < (int)interfaces.size(); iFaceIdx++) { auto checkInterface = interfaces[iFaceIdx].mIFaceTypeInst; + + SetAndRestoreValue prevTypeDef(mContext->mCurTypeState->mCurTypeDef, interfaces[iFaceIdx].mDeclaringType); + SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurBaseTypeRef, interfaces[iFaceIdx].mTypeRef); + PopulateType(checkInterface, BfPopulateType_Data); BfTypeInterfaceEntry* found = NULL; @@ -2750,6 +2754,16 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy interfaces.push_back(depIFaceEntry); } } + + if (typeInstance->mTypeFailed) + { + // Circular references in interfaces - just clear them all out + typeInstance->mInterfaces.Clear(); + interfaces.Clear(); + } + + if (_CheckTypeDone()) + return; } if ((mCompiler->mOptions.mAllowHotSwapping) && @@ -2791,7 +2805,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } BF_ASSERT(!typeInstance->mNeedsMethodProcessing); - typeInstance->mDefineState = BfTypeDefineState_HasInterfaces; + if (typeInstance->mDefineState < BfTypeDefineState_HasInterfaces) + typeInstance->mDefineState = BfTypeDefineState_HasInterfaces; for (auto& validateEntry : deferredTypeValidateList) {