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

Fixed deferred handling of delegate binds in binary operations

This commit is contained in:
Brian Fiete 2021-01-22 13:25:37 -08:00
parent 1f42567339
commit 5aeaa8808b
4 changed files with 21 additions and 6 deletions

View file

@ -6,7 +6,7 @@ BfDeferEvalChecker::BfDeferEvalChecker()
{
mNeedsDeferEval = false;
mDeferLiterals = true;
mDeferLambdaBind = true;
mDeferDelegateBind = true;
}
void BfDeferEvalChecker::Visit(BfAstNode* attribExpr)
@ -87,7 +87,13 @@ void BfDeferEvalChecker::Visit(BfInvocationExpression* invocationExpr)
void BfDeferEvalChecker::Visit(BfLambdaBindExpression* lambdaBindExpr)
{
if (mDeferLambdaBind)
if (mDeferDelegateBind)
mNeedsDeferEval = true;
}
void BfDeferEvalChecker::Visit(BfDelegateBindExpression* delegateBindExpr)
{
if (mDeferDelegateBind)
mNeedsDeferEval = true;
}

View file

@ -9,7 +9,7 @@ class BfDeferEvalChecker : public BfStructuralVisitor
{
public:
bool mNeedsDeferEval;
bool mDeferLambdaBind;
bool mDeferDelegateBind;
bool mDeferLiterals;
public:
@ -24,6 +24,7 @@ public:
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
virtual void Visit(BfInvocationExpression* invocationExpr) override;
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
virtual void Visit(BfDelegateBindExpression* delegateBindExpr) override;
virtual void Visit(BfConditionalExpression* condExpr) override;
virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;

View file

@ -5008,7 +5008,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
if (argExpr != NULL)
{
BfDeferEvalChecker deferEvalChecker;
deferEvalChecker.mDeferLambdaBind = false;
deferEvalChecker.mDeferDelegateBind = false;
argExpr->Accept(&deferEvalChecker);
deferParamEval = deferEvalChecker.mNeedsDeferEval;
}
@ -21203,7 +21203,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
if ((binaryOp == BfBinaryOp_LeftShift) || (binaryOp == BfBinaryOp_RightShift))
expectedType = mModule->GetPrimitiveType(BfTypeCode_IntPtr);
rightValue = mModule->CreateValueFromExpression(BfNodeDynCast<BfExpression>(rightExpression), expectedType, (BfEvalExprFlags)(BfEvalExprFlags_AllowSplat | BfEvalExprFlags_NoCast));
PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, (BfBinOpFlags)(flags & ~BfBinOpFlag_DeferRight), leftValue, rightValue);
if (rightValue)
PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, (BfBinOpFlags)(flags & ~BfBinOpFlag_DeferRight), leftValue, rightValue);
return;
}

View file

@ -158,8 +158,15 @@ namespace Tests
ClassB<int8>.DelegateB dlg2 = scope (val) => val + 123;
Test.Assert(dlg2(3) == 126);
void LocalEventHandler(Object sender, EventArgs e)
{
}
Event<EventHandler> e = .();
e += scope (sender, e) => {};
e += new (sender, e) => {};
e += new => LocalEventHandler;
e.Dispose();
}
public static void Modify(ref int a, ref Splattable b)