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

Improved variable assignment detection in local methods

This commit is contained in:
Brian Fiete 2022-07-30 17:12:52 -04:00
parent d43c47f866
commit 3739020504
2 changed files with 29 additions and 14 deletions

View file

@ -22502,10 +22502,18 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth
} }
} }
// Keep outs for being marked as assigned // Keep outs from being marked as assigned
auto rootMethodState = mCurMethodState->GetRootMethodState(); auto rootMethodState = mCurMethodState->GetRootMethodState();
BfDeferredLocalAssignData deferredLocalAssignData(rootMethodState->mCurScope); BfDeferredLocalAssignData deferredLocalAssignData(rootMethodState->mCurScope);
deferredLocalAssignData.mVarIdBarrier = rootMethodState->mCurLocalVarId; deferredLocalAssignData.mVarIdBarrier = rootMethodState->mCurLocalVarId;
if (rootMethodState->mDeferredLocalAssignData != NULL)
{
auto prevDLA = rootMethodState->mDeferredLocalAssignData;
while ((prevDLA != NULL) && (prevDLA->mIsChained))
prevDLA = prevDLA->mChainedAssignData;
deferredLocalAssignData.mAssignedLocals = prevDLA->mAssignedLocals;
deferredLocalAssignData.mLeftBlockUncond = prevDLA->mLeftBlockUncond;
}
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(rootMethodState->mDeferredLocalAssignData, &deferredLocalAssignData); SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(rootMethodState->mDeferredLocalAssignData, &deferredLocalAssignData);
if (!mIgnoreErrors) if (!mIgnoreErrors)
localMethod->mDidBodyErrorPass = true; localMethod->mDidBodyErrorPass = true;

View file

@ -347,22 +347,29 @@ namespace Tests
public static void TestL() public static void TestL()
{ {
int a = 8; int a = 8;
int b;
int LocalA() if (a == 8)
{ {
return 9; b = 9;
int LocalA()
{
return 9;
}
int LocalB()
{
int q = b;
return a;
}
function int() func = => LocalA;
Test.Assert(func() == 9);
delegate int() dlg = scope => LocalB;
Test.Assert(dlg() == 8);
} }
int LocalB()
{
return a;
}
function int() func = => LocalA;
Test.Assert(func() == 9);
delegate int() dlg = scope => LocalB;
Test.Assert(dlg() == 8);
} }
} }
} }