1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Fixes for new out-var rules, unassigned variable detection

This commit is contained in:
Brian Fiete 2020-09-22 07:44:47 -07:00
parent 6878183873
commit fd3265445d
9 changed files with 56 additions and 30 deletions

View file

@ -26,7 +26,6 @@ namespace Beefy.widgets
public DragHelper mDragHelper ~ delete _; public DragHelper mDragHelper ~ delete _;
public Event<Action> mCloseClickedEvent ~ _.Dispose(); public Event<Action> mCloseClickedEvent ~ _.Dispose();
delegate void Hey();
public float mWantWidth; public float mWantWidth;
public WidgetWindow mMouseDownWindow; public WidgetWindow mMouseDownWindow;

View file

@ -27,12 +27,19 @@ namespace IDETest
b = a; b = a;
} }
public void For1(out int a) //FAIL public void For1(out int a)
{ {
for (int b < 2) for (int b < 2)
a = 9; a = 9;
} }
public void For2(out int a) //FAIL
{
int b = 123;
for (int c < b)
a = 9;
}
public void Do1(out int a) //FAIL public void Do1(out int a) //FAIL
{ {
int b = 123; int b = 123;

View file

@ -9363,7 +9363,7 @@ namespace IDE
{ {
if (mBuildContext != null) if (mBuildContext != null)
{ {
if (mBuildContext.mScriptContext.mVars.TryGetValue(varName, var value)) if (mBuildContext.mScriptContext.mVars.TryGetValue(varName, out value))
{ {
if (value.VariantType == typeof(String)) if (value.VariantType == typeof(String))
{ {

View file

@ -2447,7 +2447,7 @@ namespace IDE
if (hasError) if (hasError)
mScriptManager.Fail("Unexpected error at line {0} in {1}\n\t", lineIdx + 1, textPanel.mFilePath); mScriptManager.Fail("Unexpected error at line {0} in {1}\n\t", lineIdx + 1, textPanel.mFilePath);
else else
mScriptManager.Fail("Expected error at line {0} in {1} but didn't encounter one\n\t", lineIdx + 1, textPanel.mFilePath); mScriptManager.Fail("Expected error but didn't encounter one at line {0} in {1}\n\t", lineIdx + 1, textPanel.mFilePath);
return; return;
} }
} }

View file

@ -475,6 +475,8 @@ namespace IDE.ui
{ {
if (val.StartsWith("!", StringComparison.Ordinal)) if (val.StartsWith("!", StringComparison.Ordinal))
{ {
addr = 0;
byteCount = 0;
String errorString = scope String(); String errorString = scope String();
DebugManager.GetFailString(val, evalStr, errorString); DebugManager.GetFailString(val, evalStr, errorString);
IDEApp.sApp.Fail(errorString); IDEApp.sApp.Fail(errorString);

View file

@ -2447,7 +2447,7 @@ namespace IDE.ui
if (stmtEndChar == '{') if (stmtEndChar == '{')
offsetLinePos++; offsetLinePos++;
} }
else if (GetStatementRange(toLineStart, .AllowInnerMethodSelect, var stmtStartIdx, var stmtEndIdx, var stmtEndChar) == .Declaration) else if (GetStatementRange(toLineStart, .AllowInnerMethodSelect, out stmtStartIdx, out stmtEndIdx, out stmtEndChar) == .Declaration)
{ {
if (stmtEndIdx <= toLineEnd) if (stmtEndIdx <= toLineEnd)
{ {

View file

@ -254,7 +254,7 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
if (assignKind == BfLocalVarAssignKind_None) if (assignKind == BfLocalVarAssignKind_None)
assignKind = ((deferredLocalAssignData != NULL) && (deferredLocalAssignData->mLeftBlock)) ? BfLocalVarAssignKind_Conditional : BfLocalVarAssignKind_Unconditional; assignKind = ((deferredLocalAssignData != NULL) && (deferredLocalAssignData->mLeftBlock)) ? BfLocalVarAssignKind_Conditional : BfLocalVarAssignKind_Unconditional;
if (localVar->mAssignedKind == assignKind) if (localVar->mAssignedKind >= assignKind)
{ {
// Leave it alone // Leave it alone
} }
@ -263,10 +263,6 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
if (fieldIdx >= 0) if (fieldIdx >= 0)
{ {
localVar->mUnassignedFieldFlags &= ~((int64)1 << fieldIdx); localVar->mUnassignedFieldFlags &= ~((int64)1 << fieldIdx);
/*if ((localVar->mResolvedTypeRef != NULL) && (localVar->mResolvedTypeRef->IsUnion()))
{
}*/
if (localVar->mUnassignedFieldFlags == 0) if (localVar->mUnassignedFieldFlags == 0)
{ {
if (localVar->mAssignedKind == BfLocalVarAssignKind_None) if (localVar->mAssignedKind == BfLocalVarAssignKind_None)
@ -283,15 +279,13 @@ void BfMethodState::LocalDefined(BfLocalVariable* localVar, int fieldIdx, BfLoca
BF_ASSERT(deferredLocalAssignData->mVarIdBarrier != -1); BF_ASSERT(deferredLocalAssignData->mVarIdBarrier != -1);
BfAssignedLocal defineVal = {localVar, fieldIdx, assignKind}; BfAssignedLocal defineVal = {localVar, fieldIdx, assignKind};
auto& assignedLocals = deferredLocalAssignData->mAssignedLocals; if (!deferredLocalAssignData->Contains(defineVal))
if (!assignedLocals.Contains(defineVal)) deferredLocalAssignData->mAssignedLocals.push_back(defineVal);
assignedLocals.push_back(defineVal);
if (ifDeferredLocalAssignData != NULL) if (ifDeferredLocalAssignData != NULL)
{ {
auto& assignedLocals = ifDeferredLocalAssignData->mAssignedLocals; if (!ifDeferredLocalAssignData->Contains(defineVal))
if (!assignedLocals.Contains(defineVal)) ifDeferredLocalAssignData->mAssignedLocals.push_back(defineVal);
assignedLocals.push_back(defineVal);
} }
} }
} }
@ -13895,8 +13889,6 @@ void BfModule::MarkScopeLeft(BfScopeData* scopeData)
deferredLocalAssignData->mIsUnconditional = false; deferredLocalAssignData->mIsUnconditional = false;
deferredLocalAssignData = deferredLocalAssignData->mChainedAssignData; deferredLocalAssignData = deferredLocalAssignData->mChainedAssignData;
} }
} }
// When we leave a scope, mark those as assigned for deferred assignment purposes // When we leave a scope, mark those as assigned for deferred assignment purposes
@ -13913,10 +13905,12 @@ void BfModule::MarkScopeLeft(BfScopeData* scopeData)
hadAssignment = true; hadAssignment = true;
} }
if (!hadAssignment) if (!hadAssignment)
{
localDef->mHadExitBeforeAssign = true; localDef->mHadExitBeforeAssign = true;
mCurMethodState->LocalDefined(localDef); mCurMethodState->LocalDefined(localDef);
} }
} }
}
} }
void BfModule::CreateReturn(BfIRValue val) void BfModule::CreateReturn(BfIRValue val)

View file

@ -350,6 +350,17 @@ public:
mLeftBlock = false; 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 ExtendFrom(BfDeferredLocalAssignData* outerLocalAssignData, bool doChain = false);
void BreakExtendChain(); void BreakExtendChain();
void SetIntersection(const BfDeferredLocalAssignData& otherLocalAssignData); void SetIntersection(const BfDeferredLocalAssignData& otherLocalAssignData);

View file

@ -5663,12 +5663,6 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
auto isLet = BfNodeDynCast<BfLetTypeReference>(forEachStmt->mVariableTypeRef) != 0; auto isLet = BfNodeDynCast<BfLetTypeReference>(forEachStmt->mVariableTypeRef) != 0;
auto isVar = BfNodeDynCast<BfVarTypeReference>(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; BfTypedValue target;
BfType* varType = NULL; BfType* varType = NULL;
bool didInference = false; bool didInference = false;
@ -5695,6 +5689,13 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
if (varType == NULL) if (varType == NULL)
varType = GetPrimitiveType(BfTypeCode_IntPtr); 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; deferredLocalAssignData.mIsIfCondition = false;
// The "extend chain" is only valid for the conditional -- since that expression may contain unconditionally executed and // The "extend chain" is only valid for the conditional -- since that expression may contain unconditionally executed and
@ -5814,6 +5815,18 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
mCurMethodState->mLeftBlockUncond = false; mCurMethodState->mLeftBlockUncond = false;
mCurMethodState->mLeftBlockCond = 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(); RestoreScopeState();
} }