From a457ebcbc59758af740237697b17e7bdb82e13f9 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 19 Jul 2020 06:13:03 -0700 Subject: [PATCH] Properly detecting circular data references in sized arrays --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index d9cb71f0..ac87db9a 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -991,11 +991,26 @@ bool BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType { resolvedTypeRef->mRevision = mRevision; + bool typeFailed = false; + BfSizedArrayType* arrayType = (BfSizedArrayType*)resolvedTypeRef; auto elementType = arrayType->mElementType; if (elementType->IsValueType()) - { - PopulateType(arrayType->mElementType, BfPopulateType_Data); + { + resolvedTypeRef->mDefineState = BfTypeDefineState_ResolvingBaseType; + BfTypeState typeState(mCurTypeInstance, mContext->mCurTypeState); + typeState.mPopulateType = populateType; + SetAndRestoreValue prevTypeState(mContext->mCurTypeState, &typeState); + + if (!CheckCircularDataError()) + { + PopulateType(arrayType->mElementType, BfPopulateType_Data); + } + else + { + typeFailed = true; + PopulateType(arrayType->mElementType, BfPopulateType_Identity); + } resolvedTypeRef->mDefineState = arrayType->mElementType->mDefineState; AddDependency(elementType, resolvedTypeRef, BfDependencyMap::DependencyFlag_ValueTypeMemberData); } @@ -1016,7 +1031,8 @@ bool BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType arrayType->mAlign = 1; } - arrayType->mWantsGCMarking = elementType->WantsGCMarking(); + if (!typeFailed) + arrayType->mWantsGCMarking = elementType->WantsGCMarking(); resolvedTypeRef->mDefineState = BfTypeDefineState_DefinedAndMethodsSlotted; resolvedTypeRef->mRebuildFlags = BfTypeRebuildFlag_None;