mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Fixed local method infinite-loop bug
This commit is contained in:
parent
a33ca261d5
commit
5fce0af004
1 changed files with 9 additions and 53 deletions
|
@ -2942,7 +2942,10 @@ void BfModule::VisitCodeBlock(BfBlock* block)
|
||||||
|
|
||||||
String* namePtr;
|
String* namePtr;
|
||||||
if (!mCurMethodState->mLocalMethodMap.TryAdd(localMethod->mMethodName, &namePtr, &localMethodPtr))
|
if (!mCurMethodState->mLocalMethodMap.TryAdd(localMethod->mMethodName, &namePtr, &localMethodPtr))
|
||||||
|
{
|
||||||
|
BF_ASSERT(localMethod->mNextWithSameName != *localMethodPtr);
|
||||||
localMethod->mNextWithSameName = *localMethodPtr;
|
localMethod->mNextWithSameName = *localMethodPtr;
|
||||||
|
}
|
||||||
*localMethodPtr = localMethod;
|
*localMethodPtr = localMethod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3116,56 +3119,6 @@ void BfModule::VisitCodeBlock(BfBlock* block)
|
||||||
mSystem->CheckLockYield();
|
mSystem->CheckLockYield();
|
||||||
}
|
}
|
||||||
|
|
||||||
// for (int deferredLocalMethodIdx = startDeferredLocalIdx; deferredLocalMethodIdx < (int)rootMethodState->mDeferredLocalMethods.size(); deferredLocalMethodIdx++)
|
|
||||||
// {
|
|
||||||
// auto deferredLocalMethod = rootMethodState->mDeferredLocalMethods[deferredLocalMethodIdx];
|
|
||||||
// rootMethodState->mDeferredLocalMethods[deferredLocalMethodIdx] = NULL;
|
|
||||||
//
|
|
||||||
// BfLogSysM("Processing deferred local method %p\n", deferredLocalMethod);
|
|
||||||
//
|
|
||||||
// // Process as a closure - that allows us to look back and see the const locals and stuff
|
|
||||||
// BfClosureState closureState;
|
|
||||||
// SetAndRestoreValue<BfClosureState*> prevClosureState(mCurMethodState->mClosureState, &closureState);
|
|
||||||
// closureState.mConstLocals = deferredLocalMethod->mConstLocals;
|
|
||||||
// closureState.mReturnType = deferredLocalMethod->mMethodInstance->mReturnType;
|
|
||||||
// closureState.mActiveDeferredLocalMethod = deferredLocalMethod;
|
|
||||||
//
|
|
||||||
// //methodState.mLocalMethods.Clear();
|
|
||||||
//
|
|
||||||
// // for (auto& local : methodState.mLocals)
|
|
||||||
// // delete local;
|
|
||||||
// // methodState.mLocals.Clear();
|
|
||||||
// // methodState.mLocalVarSet.Clear();
|
|
||||||
//
|
|
||||||
// //methodState.mLocals = deferredLocalMethod->mConstLocals;
|
|
||||||
//
|
|
||||||
// for (auto& constLocal : deferredLocalMethod->mConstLocals)
|
|
||||||
// {
|
|
||||||
// auto localVar = new BfLocalVariable();
|
|
||||||
// *localVar = constLocal;
|
|
||||||
// DoAddLocalVariable(localVar);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //methodState.mLocalMethods = deferredLocalMethod->mLocalMethods;
|
|
||||||
//
|
|
||||||
// bool doProcess = !mCompiler->mCanceling;
|
|
||||||
// if (doProcess)
|
|
||||||
// {
|
|
||||||
// auto curInsertPoint = mBfIRBuilder->GetInsertBlock();
|
|
||||||
//
|
|
||||||
// BP_ZONE_F("ProcessMethod local %s", deferredLocalMethod->mMethodInstance->mMethodDef->mName.c_str());
|
|
||||||
// ProcessMethod(deferredLocalMethod->mMethodInstance);
|
|
||||||
//
|
|
||||||
// mBfIRBuilder->SetInsertPoint(curInsertPoint);
|
|
||||||
// }
|
|
||||||
// delete deferredLocalMethod;
|
|
||||||
//
|
|
||||||
// mSystem->CheckLockYield();
|
|
||||||
// }
|
|
||||||
// int removeSize = (int)rootMethodState->mDeferredLocalMethods.size() - startDeferredLocalIdx;
|
|
||||||
// if (removeSize > 0)
|
|
||||||
// rootMethodState->mDeferredLocalMethods.RemoveRange(startDeferredLocalIdx, removeSize);
|
|
||||||
|
|
||||||
while ((int)mCurMethodState->mLocalMethods.size() > startLocalMethod)
|
while ((int)mCurMethodState->mLocalMethods.size() > startLocalMethod)
|
||||||
{
|
{
|
||||||
auto localMethod = mCurMethodState->mLocalMethods.back();
|
auto localMethod = mCurMethodState->mLocalMethods.back();
|
||||||
|
@ -3178,7 +3131,10 @@ void BfModule::VisitCodeBlock(BfBlock* block)
|
||||||
if (localMethod->mNextWithSameName == NULL)
|
if (localMethod->mNextWithSameName == NULL)
|
||||||
mCurMethodState->mLocalMethodMap.Remove(localMethod->mMethodName);
|
mCurMethodState->mLocalMethodMap.Remove(localMethod->mMethodName);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
mCurMethodState->mLocalMethodMap[localMethod->mMethodName] = localMethod->mNextWithSameName;
|
mCurMethodState->mLocalMethodMap[localMethod->mMethodName] = localMethod->mNextWithSameName;
|
||||||
|
localMethod->mNextWithSameName = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
mCurMethodState->mLocalMethods.pop_back();
|
mCurMethodState->mLocalMethods.pop_back();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue