mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-15 06:44:10 +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;
|
mNeedsDeferEval = false;
|
||||||
mDeferLiterals = true;
|
mDeferLiterals = true;
|
||||||
mDeferLambdaBind = true;
|
mDeferDelegateBind = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BfDeferEvalChecker::Visit(BfAstNode* attribExpr)
|
void BfDeferEvalChecker::Visit(BfAstNode* attribExpr)
|
||||||
|
@ -87,7 +87,13 @@ void BfDeferEvalChecker::Visit(BfInvocationExpression* invocationExpr)
|
||||||
|
|
||||||
void BfDeferEvalChecker::Visit(BfLambdaBindExpression* lambdaBindExpr)
|
void BfDeferEvalChecker::Visit(BfLambdaBindExpression* lambdaBindExpr)
|
||||||
{
|
{
|
||||||
if (mDeferLambdaBind)
|
if (mDeferDelegateBind)
|
||||||
|
mNeedsDeferEval = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BfDeferEvalChecker::Visit(BfDelegateBindExpression* delegateBindExpr)
|
||||||
|
{
|
||||||
|
if (mDeferDelegateBind)
|
||||||
mNeedsDeferEval = true;
|
mNeedsDeferEval = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ class BfDeferEvalChecker : public BfStructuralVisitor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool mNeedsDeferEval;
|
bool mNeedsDeferEval;
|
||||||
bool mDeferLambdaBind;
|
bool mDeferDelegateBind;
|
||||||
bool mDeferLiterals;
|
bool mDeferLiterals;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -24,6 +24,7 @@ public:
|
||||||
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
|
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
|
||||||
virtual void Visit(BfInvocationExpression* invocationExpr) override;
|
virtual void Visit(BfInvocationExpression* invocationExpr) override;
|
||||||
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
|
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
|
||||||
|
virtual void Visit(BfDelegateBindExpression* delegateBindExpr) override;
|
||||||
virtual void Visit(BfConditionalExpression* condExpr) override;
|
virtual void Visit(BfConditionalExpression* condExpr) override;
|
||||||
virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
|
virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override;
|
||||||
virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;
|
virtual void Visit(BfObjectCreateExpression* objCreateExpr) override;
|
||||||
|
|
|
@ -5008,7 +5008,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
|
||||||
if (argExpr != NULL)
|
if (argExpr != NULL)
|
||||||
{
|
{
|
||||||
BfDeferEvalChecker deferEvalChecker;
|
BfDeferEvalChecker deferEvalChecker;
|
||||||
deferEvalChecker.mDeferLambdaBind = false;
|
deferEvalChecker.mDeferDelegateBind = false;
|
||||||
argExpr->Accept(&deferEvalChecker);
|
argExpr->Accept(&deferEvalChecker);
|
||||||
deferParamEval = deferEvalChecker.mNeedsDeferEval;
|
deferParamEval = deferEvalChecker.mNeedsDeferEval;
|
||||||
}
|
}
|
||||||
|
@ -21203,6 +21203,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
|
||||||
if ((binaryOp == BfBinaryOp_LeftShift) || (binaryOp == BfBinaryOp_RightShift))
|
if ((binaryOp == BfBinaryOp_LeftShift) || (binaryOp == BfBinaryOp_RightShift))
|
||||||
expectedType = mModule->GetPrimitiveType(BfTypeCode_IntPtr);
|
expectedType = mModule->GetPrimitiveType(BfTypeCode_IntPtr);
|
||||||
rightValue = mModule->CreateValueFromExpression(BfNodeDynCast<BfExpression>(rightExpression), expectedType, (BfEvalExprFlags)(BfEvalExprFlags_AllowSplat | BfEvalExprFlags_NoCast));
|
rightValue = mModule->CreateValueFromExpression(BfNodeDynCast<BfExpression>(rightExpression), expectedType, (BfEvalExprFlags)(BfEvalExprFlags_AllowSplat | BfEvalExprFlags_NoCast));
|
||||||
|
if (rightValue)
|
||||||
PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, (BfBinOpFlags)(flags & ~BfBinOpFlag_DeferRight), leftValue, rightValue);
|
PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, (BfBinOpFlags)(flags & ~BfBinOpFlag_DeferRight), leftValue, rightValue);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,8 +158,15 @@ namespace Tests
|
||||||
ClassB<int8>.DelegateB dlg2 = scope (val) => val + 123;
|
ClassB<int8>.DelegateB dlg2 = scope (val) => val + 123;
|
||||||
Test.Assert(dlg2(3) == 126);
|
Test.Assert(dlg2(3) == 126);
|
||||||
|
|
||||||
|
void LocalEventHandler(Object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Event<EventHandler> 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)
|
public static void Modify(ref int a, ref Splattable b)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue