mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 12:32:20 +02:00
Fixes for new out-var rules, unassigned variable detection
This commit is contained in:
parent
6878183873
commit
fd3265445d
9 changed files with 56 additions and 30 deletions
|
@ -254,7 +254,7 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
|
|||
if (assignKind == BfLocalVarAssignKind_None)
|
||||
assignKind = ((deferredLocalAssignData != NULL) && (deferredLocalAssignData->mLeftBlock)) ? BfLocalVarAssignKind_Conditional : BfLocalVarAssignKind_Unconditional;
|
||||
|
||||
if (localVar->mAssignedKind == assignKind)
|
||||
if (localVar->mAssignedKind >= assignKind)
|
||||
{
|
||||
// Leave it alone
|
||||
}
|
||||
|
@ -262,11 +262,7 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
|
|||
{
|
||||
if (fieldIdx >= 0)
|
||||
{
|
||||
localVar->mUnassignedFieldFlags &= ~((int64)1 << fieldIdx);
|
||||
/*if ((localVar->mResolvedTypeRef != NULL) && (localVar->mResolvedTypeRef->IsUnion()))
|
||||
{
|
||||
|
||||
}*/
|
||||
localVar->mUnassignedFieldFlags &= ~((int64)1 << fieldIdx);
|
||||
if (localVar->mUnassignedFieldFlags == 0)
|
||||
{
|
||||
if (localVar->mAssignedKind == BfLocalVarAssignKind_None)
|
||||
|
@ -274,7 +270,7 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
localVar->mAssignedKind = assignKind;
|
||||
}
|
||||
}
|
||||
|
@ -282,16 +278,14 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
|
|||
{
|
||||
BF_ASSERT(deferredLocalAssignData->mVarIdBarrier != -1);
|
||||
|
||||
BfAssignedLocal defineVal = {localVar, fieldIdx, assignKind};
|
||||
auto& assignedLocals = deferredLocalAssignData->mAssignedLocals;
|
||||
if (!assignedLocals.Contains(defineVal))
|
||||
assignedLocals.push_back(defineVal);
|
||||
BfAssignedLocal defineVal = {localVar, fieldIdx, assignKind};
|
||||
if (!deferredLocalAssignData->Contains(defineVal))
|
||||
deferredLocalAssignData->mAssignedLocals.push_back(defineVal);
|
||||
|
||||
if (ifDeferredLocalAssignData != NULL)
|
||||
{
|
||||
auto& assignedLocals = ifDeferredLocalAssignData->mAssignedLocals;
|
||||
if (!assignedLocals.Contains(defineVal))
|
||||
assignedLocals.push_back(defineVal);
|
||||
if (!ifDeferredLocalAssignData->Contains(defineVal))
|
||||
ifDeferredLocalAssignData->mAssignedLocals.push_back(defineVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13894,9 +13888,7 @@ void BfModule::MarkScopeLeft(BfScopeData* scopeData)
|
|||
if ((deferredLocalAssignData->mScopeData != NULL) && (deferredLocalAssignData->mScopeData->mScopeDepth == scopeData->mScopeDepth))
|
||||
deferredLocalAssignData->mIsUnconditional = false;
|
||||
deferredLocalAssignData = deferredLocalAssignData->mChainedAssignData;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// When we leave a scope, mark those as assigned for deferred assignment purposes
|
||||
|
@ -13913,8 +13905,10 @@ void BfModule::MarkScopeLeft(BfScopeData* scopeData)
|
|||
hadAssignment = true;
|
||||
}
|
||||
if (!hadAssignment)
|
||||
{
|
||||
localDef->mHadExitBeforeAssign = true;
|
||||
mCurMethodState->LocalDefined(localDef);
|
||||
mCurMethodState->LocalDefined(localDef);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -350,6 +350,17 @@ public:
|
|||
mLeftBlock = false;
|
||||
}
|
||||
|
||||
bool Contains(const BfAssignedLocal& val)
|
||||
{
|
||||
for (int i = 0; i < (int)mAssignedLocals.mSize; i++)
|
||||
{
|
||||
auto& check = mAssignedLocals[i];
|
||||
if ((check.mLocalVar == val.mLocalVar) && (check.mLocalVarField == val.mLocalVarField) && (check.mAssignKind >= val.mAssignKind))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ExtendFrom(BfDeferredLocalAssignData* outerLocalAssignData, bool doChain = false);
|
||||
void BreakExtendChain();
|
||||
void SetIntersection(const BfDeferredLocalAssignData& otherLocalAssignData);
|
||||
|
|
|
@ -5662,13 +5662,7 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
|
|||
|
||||
auto isLet = BfNodeDynCast<BfLetTypeReference>(forEachStmt->mVariableTypeRef) != 0;
|
||||
auto isVar = BfNodeDynCast<BfVarTypeReference>(forEachStmt->mVariableTypeRef) != 0;
|
||||
|
||||
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
|
||||
deferredLocalAssignData.mIsIfCondition = true;
|
||||
deferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData, true);
|
||||
deferredLocalAssignData.mVarIdBarrier = mCurMethodState->GetRootMethodState()->mCurLocalVarId;
|
||||
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &deferredLocalAssignData);
|
||||
|
||||
|
||||
BfTypedValue target;
|
||||
BfType* varType = NULL;
|
||||
bool didInference = false;
|
||||
|
@ -5695,6 +5689,13 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
|
|||
if (varType == NULL)
|
||||
varType = GetPrimitiveType(BfTypeCode_IntPtr);
|
||||
|
||||
|
||||
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
|
||||
deferredLocalAssignData.mIsIfCondition = true;
|
||||
deferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData, true);
|
||||
deferredLocalAssignData.mVarIdBarrier = mCurMethodState->GetRootMethodState()->mCurLocalVarId;
|
||||
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &deferredLocalAssignData);
|
||||
|
||||
deferredLocalAssignData.mIsIfCondition = false;
|
||||
|
||||
// The "extend chain" is only valid for the conditional -- since that expression may contain unconditionally executed and
|
||||
|
@ -5813,6 +5814,18 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
|
|||
mCurMethodState->SetHadReturn(false);
|
||||
mCurMethodState->mLeftBlockUncond = false;
|
||||
mCurMethodState->mLeftBlockCond = false;
|
||||
|
||||
bool definitelyExecuted = false;
|
||||
if (target.mValue.IsConst())
|
||||
{
|
||||
auto constant = mBfIRBuilder->GetConstant(target.mValue);
|
||||
if (constant->mInt32 > 0)
|
||||
definitelyExecuted = true;
|
||||
}
|
||||
|
||||
prevDLA.Restore();
|
||||
if (definitelyExecuted)
|
||||
mCurMethodState->ApplyDeferredLocalAssignData(deferredLocalAssignData);
|
||||
|
||||
RestoreScopeState();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue