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:
parent
1f42567339
commit
5aeaa8808b
4 changed files with 21 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue