mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +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
|
@ -2,6 +2,7 @@
|
||||||
#include "../Beef/BfCommon.h"
|
#include "../Beef/BfCommon.h"
|
||||||
#include "../Compiler/BfUtil.h"
|
#include "../Compiler/BfUtil.h"
|
||||||
#include "BeefySysLib/util/BeefPerf.h"
|
#include "BeefySysLib/util/BeefPerf.h"
|
||||||
|
#include "BeefySysLib/util/StackHelper.h"
|
||||||
#include "../Compiler/BfIRCodeGen.h"
|
#include "../Compiler/BfIRCodeGen.h"
|
||||||
|
|
||||||
#include "BeefySysLib/util/AllocDebug.h"
|
#include "BeefySysLib/util/AllocDebug.h"
|
||||||
|
@ -1031,8 +1032,27 @@ void BeDbgEnumType::SetMembers(SizedArrayImpl<BeMDNode*>& members)
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void BeDumpContext::ToString(StringImpl& str, BeValue* value, bool showType, bool mdDrillDown)
|
void BeDumpContext::ToString(StringImpl& str, BeValue* value, bool showType, bool mdDrillDown, bool checkStack)
|
||||||
{
|
{
|
||||||
|
if (checkStack)
|
||||||
|
{
|
||||||
|
BP_ZONE("CreateValueFromExpression:CheckStack");
|
||||||
|
|
||||||
|
StackHelper stackHelper;
|
||||||
|
if (!stackHelper.CanStackExpand(64 * 1024))
|
||||||
|
{
|
||||||
|
if (!stackHelper.Execute([&]()
|
||||||
|
{
|
||||||
|
ToString(str, value, showType, mdDrillDown, false);
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
//Fail("Expression too complex to compile", expr);
|
||||||
|
str += "!!!FAILED!!!";
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (value == NULL)
|
if (value == NULL)
|
||||||
{
|
{
|
||||||
str += "<null>";
|
str += "<null>";
|
||||||
|
@ -1105,7 +1125,7 @@ void BeDumpContext::ToString(StringImpl& str, BeValue* value, bool showType, boo
|
||||||
str += StrFormat("%d@", lexBlock->mId);
|
str += StrFormat("%d@", lexBlock->mId);
|
||||||
ToString(str, lexBlock->mFile);
|
ToString(str, lexBlock->mFile);
|
||||||
str += ":";
|
str += ":";
|
||||||
ToString(str, lexBlock->mScope);
|
ToString(str, lexBlock->mScope, true, false, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1554,7 +1554,7 @@ public:
|
||||||
Dictionary<BeValue*, String> mValueNameMap;
|
Dictionary<BeValue*, String> mValueNameMap;
|
||||||
Dictionary<String, int> mSeenNames;
|
Dictionary<String, int> mSeenNames;
|
||||||
|
|
||||||
void ToString(StringImpl& str, BeValue* value, bool showType = true, bool mdDrillDown = false);
|
void ToString(StringImpl& str, BeValue* value, bool showType = true, bool mdDrillDown = false, bool checkStack = false);
|
||||||
void ToString(StringImpl& str, BeType* type);
|
void ToString(StringImpl& str, BeType* type);
|
||||||
void ToString(StringImpl& str, BeDbgFunction* dbgFunction, bool showScope);
|
void ToString(StringImpl& str, BeDbgFunction* dbgFunction, bool showScope);
|
||||||
static void ToString(StringImpl& str, int val);
|
static void ToString(StringImpl& str, int val);
|
||||||
|
|
|
@ -9043,7 +9043,7 @@ BfTypedValue BfModule::CreateValueFromExpression(BfExprEvaluator& exprEvaluator,
|
||||||
BP_ZONE("CreateValueFromExpression:CheckStack");
|
BP_ZONE("CreateValueFromExpression:CheckStack");
|
||||||
|
|
||||||
StackHelper stackHelper;
|
StackHelper stackHelper;
|
||||||
if (!stackHelper.CanStackExpand(64 * 1024))
|
if (!stackHelper.CanStackExpand(128 * 1024))
|
||||||
{
|
{
|
||||||
BfTypedValue result;
|
BfTypedValue result;
|
||||||
if (!stackHelper.Execute([&]()
|
if (!stackHelper.Execute([&]()
|
||||||
|
|
|
@ -148,7 +148,8 @@ enum BfEmbeddedStatementFlags : int8
|
||||||
BfEmbeddedStatementFlags_None = 0,
|
BfEmbeddedStatementFlags_None = 0,
|
||||||
BfEmbeddedStatementFlags_IsConditional = 1,
|
BfEmbeddedStatementFlags_IsConditional = 1,
|
||||||
BfEmbeddedStatementFlags_IsDeferredBlock = 2,
|
BfEmbeddedStatementFlags_IsDeferredBlock = 2,
|
||||||
BfEmbeddedStatementFlags_Unscoped = 4
|
BfEmbeddedStatementFlags_Unscoped = 4,
|
||||||
|
BfEmbeddedStatementFlags_CheckStack = 8
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BfLocalVarAssignKind : int8
|
enum BfLocalVarAssignKind : int8
|
||||||
|
|
|
@ -3989,7 +3989,7 @@ BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createS
|
||||||
{
|
{
|
||||||
MEMBER_SET(ifStmt, mElseToken, tokenNode);
|
MEMBER_SET(ifStmt, mElseToken, tokenNode);
|
||||||
mVisitorPos.MoveNext();
|
mVisitorPos.MoveNext();
|
||||||
auto falseStmt = CreateStatementAfter(ifStmt, subCreateStmtFlags);
|
auto falseStmt = CreateStatementAfter(ifStmt, (CreateStmtFlags)(subCreateStmtFlags | CreateStmtFlags_CheckStack));
|
||||||
MEMBER_SET_CHECKED(ifStmt, mFalseStatement, falseStmt);
|
MEMBER_SET_CHECKED(ifStmt, mFalseStatement, falseStmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4656,6 +4656,25 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm
|
||||||
{
|
{
|
||||||
AssertCurrentNode(node);
|
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 ((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0)
|
||||||
{
|
{
|
||||||
if (IsTerminatingExpression(node))
|
if (IsTerminatingExpression(node))
|
||||||
|
|
|
@ -39,6 +39,7 @@ public:
|
||||||
CreateStmtFlags_AllowUnterminatedExpression = 4,
|
CreateStmtFlags_AllowUnterminatedExpression = 4,
|
||||||
CreateStmtFlags_AllowLocalFunction = 8,
|
CreateStmtFlags_AllowLocalFunction = 8,
|
||||||
CreateStmtFlags_ForceVariableDecl = 0x10,
|
CreateStmtFlags_ForceVariableDecl = 0x10,
|
||||||
|
CreateStmtFlags_CheckStack = 0x20,
|
||||||
|
|
||||||
CreateStmtFlags_To_CreateExprFlags_Mask = 1
|
CreateStmtFlags_To_CreateExprFlags_Mask = 1
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "BfMangler.h"
|
#include "BfMangler.h"
|
||||||
#include "BeefySysLib/util/PerfTimer.h"
|
#include "BeefySysLib/util/PerfTimer.h"
|
||||||
#include "BeefySysLib/util/BeefPerf.h"
|
#include "BeefySysLib/util/BeefPerf.h"
|
||||||
|
#include "BeefySysLib/util/StackHelper.h"
|
||||||
#include "BfSourceClassifier.h"
|
#include "BfSourceClassifier.h"
|
||||||
#include "BfAutoComplete.h"
|
#include "BfAutoComplete.h"
|
||||||
#include "BfDemangler.h"
|
#include "BfDemangler.h"
|
||||||
|
@ -3285,6 +3286,25 @@ void BfModule::AddBasicBlock(BfIRBlock bb, bool activate)
|
||||||
|
|
||||||
void BfModule::VisitEmbeddedStatement(BfAstNode* stmt, BfExprEvaluator* exprEvaluator, BfEmbeddedStatementFlags flags)
|
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);
|
auto block = BfNodeDynCast<BfBlock>(stmt);
|
||||||
BfLabelNode* labelNode = NULL;
|
BfLabelNode* labelNode = NULL;
|
||||||
if (block == NULL)
|
if (block == NULL)
|
||||||
|
@ -3948,7 +3968,7 @@ void BfModule::DoIfStatement(BfIfStatement* ifStmt, bool includeTrueStmt, bool i
|
||||||
falseDeferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData);
|
falseDeferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData);
|
||||||
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &falseDeferredLocalAssignData);
|
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &falseDeferredLocalAssignData);
|
||||||
if (includeFalseStmt)
|
if (includeFalseStmt)
|
||||||
VisitEmbeddedStatement(ifStmt->mFalseStatement, NULL, BfEmbeddedStatementFlags_IsConditional);
|
VisitEmbeddedStatement(ifStmt->mFalseStatement, NULL, (BfEmbeddedStatementFlags)(BfEmbeddedStatementFlags_IsConditional | BfEmbeddedStatementFlags_CheckStack));
|
||||||
}
|
}
|
||||||
if ((!mCurMethodState->mLeftBlockUncond) && (!ignoredLastBlock))
|
if ((!mCurMethodState->mLeftBlockUncond) && (!ignoredLastBlock))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue