1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +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; mRootNode = NULL;
mNeedsDeferEval = false; mNeedsDeferEval = false;
mDeferLiterals = true; mDeferLiterals = true;
mDeferStrings = false;
mDeferDelegateBind = true; mDeferDelegateBind = true;
} }
@ -60,6 +61,10 @@ void BfDeferEvalChecker::Visit(BfLiteralExpression* literalExpr)
if (mDeferLiterals) if (mDeferLiterals)
mNeedsDeferEval = true; mNeedsDeferEval = true;
break; break;
case BfTypeCode_CharPtr:
if (mDeferStrings)
mNeedsDeferEval = true;
break;
default: default:
mNeedsDeferEval = false; mNeedsDeferEval = false;
} }

View file

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

View file

@ -6031,6 +6031,8 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
if (argExpr != NULL) if (argExpr != NULL)
{ {
BfDeferEvalChecker deferEvalChecker; BfDeferEvalChecker deferEvalChecker;
if ((flags & BfResolveArgsFlag_DeferStrings) != 0)
deferEvalChecker.mDeferStrings = true;
deferEvalChecker.mDeferDelegateBind = false; deferEvalChecker.mDeferDelegateBind = false;
deferEvalChecker.Check(argExpr); deferEvalChecker.Check(argExpr);
deferParamEval = deferEvalChecker.mNeedsDeferEval; deferParamEval = deferEvalChecker.mNeedsDeferEval;
@ -7424,6 +7426,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags | BfEvalExprFlags_Comptime); mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags | BfEvalExprFlags_Comptime);
} }
SetAndRestoreValue<bool> prevIgnoreWrites(mModule->mBfIRBuilder->mIgnoreWrites, mModule->mBfIRBuilder->mIgnoreWrites || IsConstEval());
if (((moduleMethodInstance.mMethodInstance->mComptimeFlags & BfComptimeFlag_OnlyFromComptime) != 0) && if (((moduleMethodInstance.mMethodInstance->mComptimeFlags & BfComptimeFlag_OnlyFromComptime) != 0) &&
((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0) && ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0) &&
((mModule->mCurMethodInstance == NULL) || (mModule->mCurMethodInstance->mComptimeFlags == BfComptimeFlag_None)) && ((mModule->mCurMethodInstance == NULL) || (mModule->mCurMethodInstance->mComptimeFlags == BfComptimeFlag_None)) &&
@ -8558,6 +8562,8 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
//BF_ASSERT(!methodInstance->GetOwner()->IsInterface()); //BF_ASSERT(!methodInstance->GetOwner()->IsInterface());
} }
prevIgnoreWrites.Restore();
if (target.mType != NULL) 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 // 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); SetAndRestoreValue<BfEvalExprFlags> prevEvalExprFlags(mBfEvalExprFlags);
if (isCascade) if (isCascade)
mBfEvalExprFlags = (BfEvalExprFlags)(mBfEvalExprFlags | BfEvalExprFlags_InCascade); 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); ResolveArgValues(argValues, resolveArgsFlags);
// //

View file

@ -34,7 +34,8 @@ enum BfResolveArgsFlags
BfResolveArgsFlag_DeferParamEval = 4, BfResolveArgsFlag_DeferParamEval = 4,
BfResolveArgsFlag_AllowUnresolvedTypes = 8, BfResolveArgsFlag_AllowUnresolvedTypes = 8,
BfResolveArgsFlag_InsideStringInterpolationAlloc = 0x10, BfResolveArgsFlag_InsideStringInterpolationAlloc = 0x10,
BfResolveArgsFlag_FromIndexer = 0x20 BfResolveArgsFlag_FromIndexer = 0x20,
BfResolveArgsFlag_DeferStrings = 0x40
}; };
enum BfResolveArgFlags enum BfResolveArgFlags