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:
parent
22b0aba954
commit
084566cdc6
7 changed files with 68 additions and 7 deletions
|
@ -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))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue