1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22: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

@ -3989,7 +3989,7 @@ BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createS
{
MEMBER_SET(ifStmt, mElseToken, tokenNode);
mVisitorPos.MoveNext();
auto falseStmt = CreateStatementAfter(ifStmt, subCreateStmtFlags);
auto falseStmt = CreateStatementAfter(ifStmt, (CreateStmtFlags)(subCreateStmtFlags | CreateStmtFlags_CheckStack));
MEMBER_SET_CHECKED(ifStmt, mFalseStatement, falseStmt);
}
@ -4656,6 +4656,25 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm
{
AssertCurrentNode(node);
if ((createStmtFlags & CreateStmtFlags_CheckStack) != 0)
{
BP_ZONE("CreateStatement.CheckStack");
StackHelper stackHelper;
if (!stackHelper.CanStackExpand(64 * 1024))
{
BfAstNode* result = NULL;
if (!stackHelper.Execute([&]()
{
result = CreateStatement(node, createStmtFlags);
}))
{
Fail("Statement too complex to parse", node);
}
return result;
}
}
if ((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0)
{
if (IsTerminatingExpression(node))