From 723e2177fc769066d681d9f98ca9b85962a4957c Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 11 Sep 2021 07:34:44 -0700 Subject: [PATCH] Fixed expressions block results where values could cross ScopeHardEnd --- IDEHelper/Compiler/BfStmtEvaluator.cpp | 12 ++++++++++-- IDEHelper/Tests/src/Expressions.bf | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 IDEHelper/Tests/src/Expressions.bf diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 1a610954..302b0512 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3401,9 +3401,17 @@ void BfModule::VisitCodeBlock(BfBlock* block) } else { + auto exprEvaluator = mCurMethodState->mCurScope->mExprEvaluator; + // Evaluate last child as an expression - mCurMethodState->mCurScope->mExprEvaluator->VisitChild(expr); - mCurMethodState->mCurScope->mExprEvaluator->FinishExpressionResult(); + exprEvaluator->VisitChild(expr); + exprEvaluator->FinishExpressionResult(); + + if ((exprEvaluator->mResult) && (!exprEvaluator->mResult.mType->IsValuelessType()) && (!exprEvaluator->mResult.IsAddr())) + { + // We need to make sure we don't retain any values through the scope's ValueScopeHardEnd + exprEvaluator->mResult = MakeAddressable(exprEvaluator->mResult); + } } break; diff --git a/IDEHelper/Tests/src/Expressions.bf b/IDEHelper/Tests/src/Expressions.bf new file mode 100644 index 00000000..dd7eea67 --- /dev/null +++ b/IDEHelper/Tests/src/Expressions.bf @@ -0,0 +1,22 @@ +#pragma warning disable 168 + +using System; + +namespace Tests +{ + class Expressions + { + [Test] + public static void TestBasics() + { + int num = -1; + if ( { + var obj = scope Object(); + num > 999 + }) + { + Test.FatalError(); + } + } + } +}