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:
parent
6878183873
commit
fd3265445d
9 changed files with 56 additions and 30 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,11 +13905,13 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue