diff --git a/IDEHelper/Backend/BeModule.cpp b/IDEHelper/Backend/BeModule.cpp index 71f7109a..5f282786 100644 --- a/IDEHelper/Backend/BeModule.cpp +++ b/IDEHelper/Backend/BeModule.cpp @@ -2,6 +2,7 @@ #include "../Beef/BfCommon.h" #include "../Compiler/BfUtil.h" #include "BeefySysLib/util/BeefPerf.h" +#include "BeefySysLib/util/StackHelper.h" #include "../Compiler/BfIRCodeGen.h" #include "BeefySysLib/util/AllocDebug.h" @@ -1031,8 +1032,27 @@ void BeDbgEnumType::SetMembers(SizedArrayImpl& 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) { str += ""; @@ -1105,7 +1125,7 @@ void BeDumpContext::ToString(StringImpl& str, BeValue* value, bool showType, boo str += StrFormat("%d@", lexBlock->mId); ToString(str, lexBlock->mFile); str += ":"; - ToString(str, lexBlock->mScope); + ToString(str, lexBlock->mScope, true, false, true); return; } diff --git a/IDEHelper/Backend/BeModule.h b/IDEHelper/Backend/BeModule.h index 637e527d..dd5cc9f4 100644 --- a/IDEHelper/Backend/BeModule.h +++ b/IDEHelper/Backend/BeModule.h @@ -1554,7 +1554,7 @@ public: Dictionary mValueNameMap; Dictionary 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, BeDbgFunction* dbgFunction, bool showScope); static void ToString(StringImpl& str, int val); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 08ed17d2..5b76c676 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -9043,7 +9043,7 @@ BfTypedValue BfModule::CreateValueFromExpression(BfExprEvaluator& exprEvaluator, BP_ZONE("CreateValueFromExpression:CheckStack"); StackHelper stackHelper; - if (!stackHelper.CanStackExpand(64 * 1024)) + if (!stackHelper.CanStackExpand(128 * 1024)) { BfTypedValue result; if (!stackHelper.Execute([&]() diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 2250300e..811b5cf3 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -148,7 +148,8 @@ enum BfEmbeddedStatementFlags : int8 BfEmbeddedStatementFlags_None = 0, BfEmbeddedStatementFlags_IsConditional = 1, BfEmbeddedStatementFlags_IsDeferredBlock = 2, - BfEmbeddedStatementFlags_Unscoped = 4 + BfEmbeddedStatementFlags_Unscoped = 4, + BfEmbeddedStatementFlags_CheckStack = 8 }; enum BfLocalVarAssignKind : int8 diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 365df273..bf8a7771 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -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)) diff --git a/IDEHelper/Compiler/BfReducer.h b/IDEHelper/Compiler/BfReducer.h index f40127ee..6188cd9d 100644 --- a/IDEHelper/Compiler/BfReducer.h +++ b/IDEHelper/Compiler/BfReducer.h @@ -39,6 +39,7 @@ public: CreateStmtFlags_AllowUnterminatedExpression = 4, CreateStmtFlags_AllowLocalFunction = 8, CreateStmtFlags_ForceVariableDecl = 0x10, + CreateStmtFlags_CheckStack = 0x20, CreateStmtFlags_To_CreateExprFlags_Mask = 1 }; diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 6bed7ee3..318f4dc8 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -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(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 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)) {