From 9cc5c14b438b831937a39056549b520075248a29 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Wed, 22 May 2019 12:29:29 +0200 Subject: [PATCH] Small optimization for binary binding --- src/Binder/Binder.cpp | 36 +++++++++++++------ .../BoundExpressions/BoundExpression.hpp | 5 +-- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/Binder/Binder.cpp b/src/Binder/Binder.cpp index 9a14c71..96361d0 100644 --- a/src/Binder/Binder.cpp +++ b/src/Binder/Binder.cpp @@ -70,10 +70,12 @@ BoundExpression* Binder::BindBinaryOperator(BinaryExpression* expression){ auto rightNumeric = (NumericScriptType*)boundRightType; if (leftNumeric->IsAwareOfFloat() && rightNumeric->IsAwareOfFloat()){ return new BoundBinaryExpression(boundLeft, boundRight, - BoundBinaryOperation::Addition, new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat())); + BoundBinaryOperation::Addition, new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat()), + expression->GetStartPosition(), expression->GetLength()); } else{ - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Addition, new NumericScriptType(false, false)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Addition, new NumericScriptType(false, false), + expression->GetStartPosition(), expression->GetLength()); } } //TODO: String Concatenation @@ -84,10 +86,13 @@ BoundExpression* Binder::BindBinaryOperator(BinaryExpression* expression){ auto rightNumeric = (NumericScriptType*)boundRightType; if (leftNumeric->IsAwareOfFloat() && rightNumeric->IsAwareOfFloat()){ return new BoundBinaryExpression(boundLeft, boundRight, - BoundBinaryOperation::Subtraction, new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat())); + BoundBinaryOperation::Subtraction, + new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat()), + expression->GetStartPosition(), expression->GetLength()); } else{ - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Subtraction, new NumericScriptType(false, false)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Subtraction, new NumericScriptType(false, false), + expression->GetStartPosition(), expression->GetLength()); } } break; @@ -97,10 +102,13 @@ BoundExpression* Binder::BindBinaryOperator(BinaryExpression* expression){ auto rightNumeric = (NumericScriptType*)boundRightType; if (leftNumeric->IsAwareOfFloat() && rightNumeric->IsAwareOfFloat()){ return new BoundBinaryExpression(boundLeft, boundRight, - BoundBinaryOperation::Multiplication, new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat())); + BoundBinaryOperation::Multiplication, + new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat()), + expression->GetStartPosition(), expression->GetLength()); } else{ - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Multiplication, new NumericScriptType(false, false)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Multiplication, new NumericScriptType(false, false), + expression->GetStartPosition(), expression->GetLength()); } } break; @@ -110,22 +118,28 @@ BoundExpression* Binder::BindBinaryOperator(BinaryExpression* expression){ auto rightNumeric = (NumericScriptType*)boundRightType; if (leftNumeric->IsAwareOfFloat() && rightNumeric->IsAwareOfFloat()){ return new BoundBinaryExpression(boundLeft, boundRight, - BoundBinaryOperation::Division, new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat())); + BoundBinaryOperation::Division, + new NumericScriptType(true, leftNumeric->IsFloat() || rightNumeric->IsFloat()), + expression->GetStartPosition(), expression->GetLength()); } else{ - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Division, new NumericScriptType(false, false)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Division, new NumericScriptType(false, false), + expression->GetStartPosition(), expression->GetLength()); } } break; case BinaryOperatorKind ::Equality: - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Equality, new ScriptType(TypeClass::Bool)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::Equality, new ScriptType(TypeClass::Bool), + expression->GetStartPosition(), expression->GetLength()); case BinaryOperatorKind ::LogicalAnd: if (boundLeftType->GetClass() == TypeClass::Bool && boundRightType->GetClass() == TypeClass::Bool) - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::LogicalAnd, new ScriptType(TypeClass::Bool)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::LogicalAnd, new ScriptType(TypeClass::Bool), + expression->GetStartPosition(), expression->GetLength()); break; case BinaryOperatorKind ::LogicalOr: if (boundLeftType->GetClass() == TypeClass::Bool && boundRightType->GetClass() == TypeClass::Bool) - return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::LogicalOr, new ScriptType(TypeClass::Bool)); + return new BoundBinaryExpression(boundLeft, boundRight, BoundBinaryOperation::LogicalOr, new ScriptType(TypeClass::Bool), + expression->GetStartPosition(), expression->GetLength()); break; default: break; diff --git a/src/Binder/BoundExpressions/BoundExpression.hpp b/src/Binder/BoundExpressions/BoundExpression.hpp index 3ff515b..e61e149 100644 --- a/src/Binder/BoundExpressions/BoundExpression.hpp +++ b/src/Binder/BoundExpressions/BoundExpression.hpp @@ -135,8 +135,9 @@ class BoundBinaryExpression : public BoundExpression { BoundExpression* _right; BoundBinaryOperation _operation; public: - BoundBinaryExpression(BoundExpression* left, BoundExpression* right, BoundBinaryOperation op, ScriptType* result) - : BoundExpression(left->GetStartPosition(), right->GetEndPosition() - left->GetStartPosition(), result){ + BoundBinaryExpression(BoundExpression* left, BoundExpression* right, BoundBinaryOperation op, ScriptType* result, + unsigned int start, unsigned int length) + : BoundExpression(start, length, result){ _left = left; _right = right; _operation = op;