From bd054b1077dbb776bb7dd1b459a980bbcb18b726 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 7 Sep 2019 13:52:44 +0200 Subject: [PATCH] Fixed right hand in Logical And operation being evaluated when left hand was false --- src/Evaluator/Evaluator.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Evaluator/Evaluator.cpp b/src/Evaluator/Evaluator.cpp index c5130ce..c70e723 100644 --- a/src/Evaluator/Evaluator.cpp +++ b/src/Evaluator/Evaluator.cpp @@ -267,13 +267,17 @@ namespace Porygon::Evaluation { } EvalValuePointer Evaluator::EvaluateBinary(const BoundBinaryExpression *expression){ - auto leftValue = this -> EvaluateExpression(expression->GetLeft()); - auto rightValue = this -> EvaluateExpression(expression->GetRight()); auto operation = expression->GetOperation(); + auto leftValue = this -> EvaluateExpression(expression->GetLeft()); + if (operation == BoundBinaryOperation::LogicalAnd){ + if (!leftValue->EvaluateBool()) + return new BooleanEvalValue(false); + } + auto rightValue = this -> EvaluateExpression(expression->GetRight()); if (operation == BoundBinaryOperation::Equality){ - return new BooleanEvalValue(leftValue == rightValue); + return new BooleanEvalValue(leftValue->operator==(rightValue.Get())); } else if (operation == BoundBinaryOperation::Inequality){ - return new BooleanEvalValue(leftValue != rightValue); + return new BooleanEvalValue(leftValue->operator!=(rightValue.Get())); } return leftValue->BinaryOperation(operation, rightValue.Get()); }