From b10edc6f0a3a8d7483fdfdd19bb3c2c29db445e2 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 28 Oct 2021 10:48:05 -0700 Subject: [PATCH] Fixed dyn scope detection in null conditional --- IDEHelper/Compiler/BfExprEvaluator.cpp | 28 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index d665d804..f695fae8 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3020,16 +3020,24 @@ void BfExprEvaluator::Evaluate(BfAstNode* astNode, bool propogateNullConditional // ParenthesizedExpression breaks null conditional chain if (astNode->IsExact()) propogateNullConditional = false; + + bool scopeWasConditional = false; BfPendingNullConditional* pendingNullCond = NULL; + mInsidePendingNullable = false; if (mModule->mCurMethodState != NULL) { + scopeWasConditional = mModule->mCurMethodState->mCurScope->mIsConditional; pendingNullCond = mModule->mCurMethodState->mPendingNullConditional; if (!propogateNullConditional) mModule->mCurMethodState->mPendingNullConditional = NULL; - } - mInsidePendingNullable = pendingNullCond != NULL; - + if (pendingNullCond != NULL) + { + mInsidePendingNullable = true; + mModule->mCurMethodState->mCurScope->mIsConditional = true; + } + } + astNode->Accept(this); GetResult(); @@ -3042,11 +3050,17 @@ void BfExprEvaluator::Evaluate(BfAstNode* astNode, bool propogateNullConditional if ((mBfEvalExprFlags & BfEvalExprFlags_AllowIntUnknown) == 0) mModule->FixIntUnknown(mResult); - if ((!propogateNullConditional) && (mModule->mCurMethodState != NULL)) + if (mModule->mCurMethodState != NULL) { - if (mModule->mCurMethodState->mPendingNullConditional != NULL) - mResult = mModule->FlushNullConditional(mResult, ignoreNullConditional); - mModule->mCurMethodState->mPendingNullConditional = pendingNullCond; + if (mInsidePendingNullable) + mModule->mCurMethodState->mCurScope->mIsConditional = scopeWasConditional; + + if (!propogateNullConditional) + { + if (mModule->mCurMethodState->mPendingNullConditional != NULL) + mResult = mModule->FlushNullConditional(mResult, ignoreNullConditional); + mModule->mCurMethodState->mPendingNullConditional = pendingNullCond; + } } }