瀏覽代碼

Fixed issue with comptime strings ending up in executable

Brian Fiete 2 年之前
父節點
當前提交
b261615bd9

+ 5 - 0
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;
 	}

+ 1 - 0
IDEHelper/Compiler/BfDeferEvalChecker.h

@@ -12,6 +12,7 @@ public:
 	bool mNeedsDeferEval;
 	bool mDeferDelegateBind;
 	bool mDeferLiterals;
+	bool mDeferStrings;
 
 public:
 	BfDeferEvalChecker();

+ 13 - 0
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<bool> 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<BfEvalExprFlags> 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);
 
 	//

+ 2 - 1
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