From fd001a2f69e5ed363c42fa8c0e637ca4b2c429c8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 8 Feb 2021 07:56:23 -0800 Subject: [PATCH] Fixed erroneous data cycle detection in unions --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 11 ++++++++--- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 4 ++-- IDEHelper/Compiler/BfResolvedTypeUtils.h | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index c4b1a44e..129a15b4 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -2642,8 +2642,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (typeInstance->mIsFinishingType) { - // This type already failed - return; + if (typeInstance->mTypeFailed) + return; } if (!typeInstance->mTypeFailed) @@ -3736,7 +3736,12 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (populateChildType) { - BF_ASSERT(!resolvedFieldType->IsDataIncomplete()); + if (resolvedFieldType->IsFinishingType()) + { + AssertErrorState(); + } + else + BF_ASSERT(!resolvedFieldType->IsDataIncomplete()); } else { diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 26044546..a3335f72 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -1686,7 +1686,7 @@ BfType* BfTypeInstance::GetUnionInnerType(bool* wantSplat) { SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, fieldDef); - mModule->PopulateType(checkInnerType); + mModule->PopulateType(checkInnerType, checkInnerType->IsValueType() ? BfPopulateType_Data : BfPopulateType_Declaration); if (checkInnerType->mSize > unionSize) unionSize = checkInnerType->mSize; @@ -2196,7 +2196,7 @@ bool BfTypeInstance::WantsGCMarking() return true; if ((IsEnum()) && (!IsPayloadEnum())) return false; - BF_ASSERT(mDefineState >= BfTypeDefineState_Defined); + BF_ASSERT((mDefineState >= BfTypeDefineState_Defined) || (mTypeFailed)); return mWantsGCMarking; } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 4e8172bc..097a3ea6 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -501,6 +501,7 @@ public: virtual bool HasBeenReferenced() { return mDefineState != BfTypeDefineState_Undefined; } virtual bool HasTypeFailed() { return false; } virtual bool IsDataIncomplete() { return mDefineState == BfTypeDefineState_Undefined; } + virtual bool IsFinishingType() { return false; } virtual bool IsIncomplete() { return mDefineState < BfTypeDefineState_Defined; } virtual bool IsDeleting() { return ((mRebuildFlags & (BfTypeRebuildFlag_Deleted | BfTypeRebuildFlag_DeleteQueued)) != 0); } virtual bool IsDeclared() { return mDefineState >= BfTypeDefineState_Declared; } @@ -1954,6 +1955,7 @@ public: virtual bool IsReified() override { return mIsReified; } virtual bool NeedsExplicitAlignment() override { return !IsSizeAligned() || mIsPacked; } virtual bool IsDataIncomplete() override { return ((mTypeIncomplete) || (mBaseTypeMayBeIncomplete)) && (!mNeedsMethodProcessing); } + virtual bool IsFinishingType() override { return mIsFinishingType; } virtual bool IsIncomplete() override { return (mTypeIncomplete) || (mBaseTypeMayBeIncomplete); } virtual bool IsSplattable() override { BF_ASSERT((mInstSize >= 0) || (!IsComposite())); return mIsSplattable; } virtual int GetSplatCount() override;