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

Use StackHelper for very long if/else chains

This commit is contained in:
Brian Fiete 2024-03-18 05:44:02 -04:00
parent 22b0aba954
commit 084566cdc6
7 changed files with 68 additions and 7 deletions

View file

@ -8,6 +8,7 @@
#include "BfMangler.h"
#include "BeefySysLib/util/PerfTimer.h"
#include "BeefySysLib/util/BeefPerf.h"
#include "BeefySysLib/util/StackHelper.h"
#include "BfSourceClassifier.h"
#include "BfAutoComplete.h"
#include "BfDemangler.h"
@ -3285,6 +3286,25 @@ void BfModule::AddBasicBlock(BfIRBlock bb, bool activate)
void BfModule::VisitEmbeddedStatement(BfAstNode* stmt, BfExprEvaluator* exprEvaluator, BfEmbeddedStatementFlags flags)
{
if ((flags & BfEmbeddedStatementFlags_CheckStack) != 0)
{
BP_ZONE("BfModule.VisitEmbeddedStatement");
StackHelper stackHelper;
if (!stackHelper.CanStackExpand(64 * 1024))
{
if (!stackHelper.Execute([&]()
{
VisitEmbeddedStatement(stmt, exprEvaluator, flags);
}))
{
Fail("Statement too complex to parse", stmt);
}
return;
}
}
auto block = BfNodeDynCast<BfBlock>(stmt);
BfLabelNode* labelNode = NULL;
if (block == NULL)
@ -3948,7 +3968,7 @@ void BfModule::DoIfStatement(BfIfStatement* ifStmt, bool includeTrueStmt, bool i
falseDeferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData);
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &falseDeferredLocalAssignData);
if (includeFalseStmt)
VisitEmbeddedStatement(ifStmt->mFalseStatement, NULL, BfEmbeddedStatementFlags_IsConditional);
VisitEmbeddedStatement(ifStmt->mFalseStatement, NULL, (BfEmbeddedStatementFlags)(BfEmbeddedStatementFlags_IsConditional | BfEmbeddedStatementFlags_CheckStack));
}
if ((!mCurMethodState->mLeftBlockUncond) && (!ignoredLastBlock))
{