From 3806af6c759dc33f4215b4816eed85991c982072 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 19 Jun 2021 11:00:57 -0700 Subject: [PATCH] Split mHadBreak from mLeftBlock --- IDEHelper/Compiler/BfModule.h | 4 +++- IDEHelper/Compiler/BfStmtEvaluator.cpp | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 08cebbd6..ad002fe1 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -350,10 +350,11 @@ public: BfDeferredLocalAssignData* mChainedAssignData; bool mHadFallthrough; bool mHadReturn; + bool mHadBreak; bool mIsUnconditional; bool mIsIfCondition; bool mIfMayBeSkipped; - bool mLeftBlock; + bool mLeftBlock; public: BfDeferredLocalAssignData(BfScopeData* scopeData = NULL) @@ -362,6 +363,7 @@ public: mVarIdBarrier = -1; mHadFallthrough = false; mHadReturn = false; + mHadBreak = false; mChainedAssignData = NULL; mIsChained = false; mIsUnconditional = false; diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 52975080..cc9e893c 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3622,7 +3622,7 @@ void BfModule::DoIfStatement(BfIfStatement* ifStmt, bool includeTrueStmt, bool i } prevDLA.Restore(); if (mCurMethodState->mDeferredLocalAssignData != NULL) - mCurMethodState->mDeferredLocalAssignData->mLeftBlock = deferredLocalAssignData.mLeftBlock; + mCurMethodState->mDeferredLocalAssignData->mHadBreak |= deferredLocalAssignData.mHadBreak; bool trueHadReturn = mCurMethodState->mHadReturn; @@ -4675,7 +4675,7 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) deferredLocalAssignDataVec[blockIdx].mHadReturn = hadReturn; caseCount++; if ((!hadReturn) && - ((!mCurMethodState->mDeferredLocalAssignData->mHadFallthrough) || (mCurMethodState->mDeferredLocalAssignData->mLeftBlock))) + ((!mCurMethodState->mDeferredLocalAssignData->mHadFallthrough) || (mCurMethodState->mDeferredLocalAssignData->mHadBreak))) allHadReturns = false; if (auto block = BfNodeDynCast(switchCase->mCodeBlock)) @@ -5126,7 +5126,10 @@ void BfModule::Visit(BfBreakStatement* breakStmt) while (checkLocalAssignData != NULL) { if ((checkLocalAssignData->mScopeData != NULL) && (checkLocalAssignData->mScopeData->mScopeDepth >= breakData->mScope->mScopeDepth)) + { checkLocalAssignData->mLeftBlock = true; + checkLocalAssignData->mHadBreak = true; + } checkLocalAssignData = checkLocalAssignData->mChainedAssignData; }