From b261615bd9ff4c56ba060250a4392d1a33332a44 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 2 Mar 2023 12:41:07 -0500 Subject: [PATCH] Fixed issue with comptime strings ending up in executable --- IDEHelper/Compiler/BfDeferEvalChecker.cpp | 5 +++++ IDEHelper/Compiler/BfDeferEvalChecker.h | 1 + IDEHelper/Compiler/BfExprEvaluator.cpp | 13 +++++++++++++ IDEHelper/Compiler/BfExprEvaluator.h | 3 ++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfDeferEvalChecker.cpp b/IDEHelper/Compiler/BfDeferEvalChecker.cpp index b583237f..40c16331 100644 --- a/IDEHelper/Compiler/BfDeferEvalChecker.cpp +++ b/IDEHelper/Compiler/BfDeferEvalChecker.cpp @@ -8,6 +8,7 @@ BfDeferEvalChecker::BfDeferEvalChecker() mRootNode = NULL; mNeedsDeferEval = false; mDeferLiterals = true; + mDeferStrings = false; mDeferDelegateBind = true; } @@ -60,6 +61,10 @@ void BfDeferEvalChecker::Visit(BfLiteralExpression* literalExpr) if (mDeferLiterals) mNeedsDeferEval = true; break; + case BfTypeCode_CharPtr: + if (mDeferStrings) + mNeedsDeferEval = true; + break; default: mNeedsDeferEval = false; } diff --git a/IDEHelper/Compiler/BfDeferEvalChecker.h b/IDEHelper/Compiler/BfDeferEvalChecker.h index 7d46fb15..06d669dd 100644 --- a/IDEHelper/Compiler/BfDeferEvalChecker.h +++ b/IDEHelper/Compiler/BfDeferEvalChecker.h @@ -12,6 +12,7 @@ public: bool mNeedsDeferEval; bool mDeferDelegateBind; bool mDeferLiterals; + bool mDeferStrings; public: BfDeferEvalChecker(); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index b122b8f2..ac10e8ed 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -6031,6 +6031,8 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr if (argExpr != NULL) { BfDeferEvalChecker deferEvalChecker; + if ((flags & BfResolveArgsFlag_DeferStrings) != 0) + deferEvalChecker.mDeferStrings = true; deferEvalChecker.mDeferDelegateBind = false; deferEvalChecker.Check(argExpr); deferParamEval = deferEvalChecker.mNeedsDeferEval; @@ -7424,6 +7426,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags | BfEvalExprFlags_Comptime); } + SetAndRestoreValue prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, mModule->mBfIRBuilder->mIgnoreWrites || IsConstEval()); + if (((moduleMethodInstance.mMethodInstance->mComptimeFlags & BfComptimeFlag_OnlyFromComptime) != 0) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0) && ((mModule->mCurMethodInstance == NULL) || (mModule->mCurMethodInstance->mComptimeFlags == BfComptimeFlag_None)) && @@ -8558,6 +8562,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu //BF_ASSERT(!methodInstance->GetOwner()->IsInterface()); } + prevIgnoreWrites.Restore(); + if (target.mType != NULL) { // When we call a method from a static ctor, that method could access static fields so we need to make sure @@ -18770,6 +18776,13 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m SetAndRestoreValue prevEvalExprFlags(mBfEvalExprFlags); if (isCascade) mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags | BfEvalExprFlags_InCascade); + + if (((mayBeComptimeCall) && (!mModule->mIsComptimeModule) && (!mModule->mBfIRBuilder->mIgnoreWrites)) || + ((mModule->mAttributeState != NULL) && (mModule->mAttributeState->mCustomAttributes != NULL) && (mModule->mAttributeState->mCustomAttributes->Contains(mModule->mCompiler->mConstEvalAttributeTypeDef)))) + { + resolveArgsFlags = (BfResolveArgsFlags)(resolveArgsFlags | BfResolveArgsFlag_DeferParamEval | BfResolveArgsFlag_DeferStrings); + } + ResolveArgValues(argValues, resolveArgsFlags); // diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index cf013954..26d15042 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -34,7 +34,8 @@ enum BfResolveArgsFlags BfResolveArgsFlag_DeferParamEval = 4, BfResolveArgsFlag_AllowUnresolvedTypes = 8, BfResolveArgsFlag_InsideStringInterpolationAlloc = 0x10, - BfResolveArgsFlag_FromIndexer = 0x20 + BfResolveArgsFlag_FromIndexer = 0x20, + BfResolveArgsFlag_DeferStrings = 0x40 }; enum BfResolveArgFlags