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

Local static local method referencing of locals

This commit is contained in:
Brian Fiete 2022-02-11 13:34:25 -05:00
parent c8ba4a9e42
commit 9d2a22da4b

View file

@ -21485,8 +21485,7 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth
wantsVisitBody = false; wantsVisitBody = false;
if (methodInstance->IsOrInUnspecializedVariation()) if (methodInstance->IsOrInUnspecializedVariation())
wantsVisitBody = false; wantsVisitBody = false;
if ((methodDeclaration != NULL) && (methodDeclaration->mStaticSpecifier != NULL)) bool allowCapture = (methodDeclaration == NULL) || (methodDeclaration->mStaticSpecifier == NULL);
wantsVisitBody = false;
if (wantsVisitBody) if (wantsVisitBody)
{ {
@ -21562,7 +21561,7 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth
std::multiset<BfClosureCapturedEntry> capturedEntries; std::multiset<BfClosureCapturedEntry> capturedEntries;
// //
{ {
auto varMethodState = declMethodState; auto varMethodState = declMethodState;
@ -21582,6 +21581,12 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth
auto localVar = varMethodState->mLocals[localIdx]; auto localVar = varMethodState->mLocals[localIdx];
if ((localVar->mReadFromId >= closureState.mCaptureStartAccessId) || (localVar->mWrittenToId >= closureState.mCaptureStartAccessId)) if ((localVar->mReadFromId >= closureState.mCaptureStartAccessId) || (localVar->mWrittenToId >= closureState.mCaptureStartAccessId))
{ {
if (!allowCapture)
{
if ((!localVar->mIsStatic) && (!localVar->mConstValue))
continue;
}
if (localVar->mIsThis) if (localVar->mIsThis)
{ {
// We can only set mutating if our owning type is mutating // We can only set mutating if our owning type is mutating
@ -21602,7 +21607,7 @@ BfModuleMethodInstance BfModule::GetLocalMethodInstance(BfLocalMethod* localMeth
continue; continue;
} }
if ((localVar->mConstValue) || (localVar->mResolvedType->IsValuelessType())) if ((localVar->mConstValue) || (localVar->mIsStatic) || (localVar->mResolvedType->IsValuelessType()))
{ {
closureState.mConstLocals.push_back(*localVar); closureState.mConstLocals.push_back(*localVar);
continue; continue;