1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Const lhs handling of ??, cond var assignment in CreateConditionalScope

This commit is contained in:
Brian Fiete 2022-02-16 08:28:05 -05:00
parent 4c499cc498
commit ae53196e74
5 changed files with 65 additions and 11 deletions

View file

@ -8621,8 +8621,19 @@ BfTypedValue BfModule::FlushNullConditional(BfTypedValue result, bool ignoreNull
return result;
}
BF_NOINLINE void BfModule::EvaluateWithNewScope(BfExprEvaluator& exprEvaluator, BfExpression* expr, BfEvalExprFlags flags)
BF_NOINLINE void BfModule::EvaluateWithNewConditionalScope(BfExprEvaluator& exprEvaluator, BfExpression* expr, BfEvalExprFlags flags)
{
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData);
if (mCurMethodState != NULL)
{
deferredLocalAssignData.mIsIfCondition = true;
deferredLocalAssignData.mIfMayBeSkipped = true;
deferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData, false);
deferredLocalAssignData.mVarIdBarrier = mCurMethodState->GetRootMethodState()->mCurLocalVarId;
mCurMethodState->mDeferredLocalAssignData = &deferredLocalAssignData;
}
BfScopeData newScope;
newScope.mOuterIsConditional = true;
newScope.mAllowTargeting = false;
@ -8630,9 +8641,11 @@ BF_NOINLINE void BfModule::EvaluateWithNewScope(BfExprEvaluator& exprEvaluator,
{
mCurMethodState->AddScope(&newScope);
NewScopeState(true, false);
}
}
exprEvaluator.mBfEvalExprFlags = (BfEvalExprFlags)(exprEvaluator.mBfEvalExprFlags | flags);
exprEvaluator.Evaluate(expr, (flags & BfEvalExprFlags_PropogateNullConditional) != 0, (flags & BfEvalExprFlags_IgnoreNullConditional) != 0, (flags & BfEvalExprFlags_AllowSplat) != 0);
if (mCurMethodState != NULL)
RestoreScopeState();
}
@ -8669,7 +8682,15 @@ BfTypedValue BfModule::CreateValueFromExpression(BfExprEvaluator& exprEvaluator,
if ((flags & BfEvalExprFlags_CreateConditionalScope) != 0)
{
EvaluateWithNewScope(exprEvaluator, expr, flags);
if ((mCurMethodState == NULL) || (mCurMethodState->mCurScope->mScopeKind != BfScopeKind_StatementTarget_Conditional))
{
EvaluateWithNewConditionalScope(exprEvaluator, expr, flags);
}
else
{
SetAndRestoreValue<bool> prevIsConditional(mCurMethodState->mCurScope->mIsConditional, true);
exprEvaluator.Evaluate(expr, (flags & BfEvalExprFlags_PropogateNullConditional) != 0, (flags & BfEvalExprFlags_IgnoreNullConditional) != 0, true);
}
}
else
exprEvaluator.Evaluate(expr, (flags & BfEvalExprFlags_PropogateNullConditional) != 0, (flags & BfEvalExprFlags_IgnoreNullConditional) != 0, true);