1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 12:32:20 +02:00

Fixes to variable assignment detection

This commit is contained in:
Brian Fiete 2022-07-05 08:41:16 -07:00
parent 5277797d73
commit 4d1d972599
3 changed files with 60 additions and 19 deletions

View file

@ -5054,19 +5054,27 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
if (switchCase->mCodeBlock != NULL)
{
isComprehensive = true;
UpdateSrcPos(switchCase->mCodeBlock);
UpdateSrcPos(switchCase->mCodeBlock);
deferredLocalAssignDataVec[blockIdx].mScopeData = mCurMethodState->mCurScope;
deferredLocalAssignDataVec[blockIdx].ExtendFrom(mCurMethodState->mDeferredLocalAssignData);
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &deferredLocalAssignDataVec[blockIdx]);
mCurMethodState->mDeferredLocalAssignData->mVarIdBarrier = startingLocalVarId;
BfScopeData caseScopeData;
caseScopeData.mOuterIsConditional = true;
caseScopeData.mIsSharedTempBlock = true;
mCurMethodState->AddScope(&caseScopeData);
NewScopeState();
bool hadReturn = false;
VisitCodeBlock(switchCase->mCodeBlock, BfIRBlock(), endBlock, BfIRBlock(), true, &hadReturn, switchStmt->mLabelNode);
deferredLocalAssignDataVec[blockIdx].mHadReturn = hadReturn;
caseCount++;
if (!hadReturn)
allHadReturns = false;
RestoreScopeState();
}
}
else
@ -5796,9 +5804,12 @@ void BfModule::Visit(BfRepeatStatement* repeatStmt)
}
}
RestoreScopeState();
prevDLA.Restore();
mCurMethodState->ApplyDeferredLocalAssignData(deferredLocalAssignData);
if (isInfiniteLoop)
EmitDefaultReturn();
}