1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Fixed issue with comptime strings ending up in executable

This commit is contained in:
Brian Fiete 2023-03-02 12:41:07 -05:00
parent ca3abc617f
commit b261615bd9
4 changed files with 21 additions and 1 deletions

View file

@ -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;
}

View file

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

View file

@ -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);
//

View file

@ -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