diff options
author | David Crocker <dcrocker@eschertech.com> | 2021-06-07 16:26:31 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2021-06-07 16:26:31 +0300 |
commit | b41de852a65359a6361a50fc4700cb6578ae97c1 (patch) | |
tree | 5f73399233e2e285f85d5de6618eb75316bc5d35 | |
parent | 8d12f40337f749450479c9a2079b694441f1dddb (diff) |
Fixed issue with doing maths on unsigned values e.g. job.filePosition
-rw-r--r-- | src/GCodes/GCodeBuffer/ExpressionParser.cpp | 50 | ||||
-rw-r--r-- | src/GCodes/GCodeBuffer/ExpressionParser.h | 1 |
2 files changed, 30 insertions, 21 deletions
diff --git a/src/GCodes/GCodeBuffer/ExpressionParser.cpp b/src/GCodes/GCodeBuffer/ExpressionParser.cpp index 2a536da1..133ed763 100644 --- a/src/GCodes/GCodeBuffer/ExpressionParser.cpp +++ b/src/GCodes/GCodeBuffer/ExpressionParser.cpp @@ -562,13 +562,23 @@ uint32_t ExpressionParser::ParseUnsigned() THROWS(GCodeException) void ExpressionParser::BalanceNumericTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) const THROWS(GCodeException) { - if (val1.GetType() == TypeCode::Float) + // First convert any Uint64 or Uint32 operands to float + if (val1.GetType() == TypeCode::Uint64 || val1.GetType() == TypeCode::Uint32) + { + ConvertToFloat(val1, evaluate); + } + if (val2.GetType() == TypeCode::Uint64 || val2.GetType() == TypeCode::Uint32) { ConvertToFloat(val2, evaluate); } + + if (val1.GetType() == TypeCode::Float) + { + ConvertToFloat(val2, evaluate); // both are now float + } else if (val2.GetType() == TypeCode::Float) { - ConvertToFloat(val1, evaluate); + ConvertToFloat(val1, evaluate); // both are now float } else if (val1.GetType() != TypeCode::Int32 || val2.GetType() != TypeCode::Int32) { @@ -589,6 +599,16 @@ void ExpressionParser::BalanceNumericTypes(ExpressionValue& val1, ExpressionValu // Balance types for a comparison operator void ExpressionParser::BalanceTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) THROWS(GCodeException) { + // First convert any Uint64 or Uint32 operands to float + if (val1.GetType() == TypeCode::Uint64 || val1.GetType() == TypeCode::Uint32) + { + ConvertToFloat(val1, evaluate); + } + if (val2.GetType() == TypeCode::Uint64 || val2.GetType() == TypeCode::Uint32) + { + ConvertToFloat(val2, evaluate); + } + if ((val1.GetType() == val2.GetType()) || (val1.IsStringType() && val2.IsStringType())) // handle the common case first { // nothing to do @@ -620,32 +640,22 @@ void ExpressionParser::BalanceTypes(ExpressionValue& val1, ExpressionValue& val2 } } -void ExpressionParser::EnsureNumeric(ExpressionValue& val, bool evaluate) const THROWS(GCodeException) +void ExpressionParser::ConvertToFloat(ExpressionValue& val, bool evaluate) const THROWS(GCodeException) { switch (val.GetType()) { case TypeCode::Uint32: - val.SetType(TypeCode::Int32); - val.iVal = val.uVal; + val.SetType(TypeCode::Float); + val.fVal = (float)val.uVal; + val.param = 1; break; - case TypeCode::Int32: - case TypeCode::Float: + case TypeCode::Uint64: + val.SetType(TypeCode::Float); + val.fVal = (float)val.Get56BitValue(); + val.param = 1; break; - default: - if (evaluate) - { - ThrowParseException("expected numeric operand"); - } - val.Set((int32_t)0); - } -} - -void ExpressionParser::ConvertToFloat(ExpressionValue& val, bool evaluate) const THROWS(GCodeException) -{ - switch (val.GetType()) - { case TypeCode::Int32: val.fVal = (float)val.iVal; val.SetType(TypeCode::Float); diff --git a/src/GCodes/GCodeBuffer/ExpressionParser.h b/src/GCodes/GCodeBuffer/ExpressionParser.h index 778a5b22..fc8dc1b3 100644 --- a/src/GCodes/GCodeBuffer/ExpressionParser.h +++ b/src/GCodes/GCodeBuffer/ExpressionParser.h @@ -54,7 +54,6 @@ private: void BalanceNumericTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) const THROWS(GCodeException); void BalanceTypes(ExpressionValue& val1, ExpressionValue& val2, bool evaluate) THROWS(GCodeException); - void EnsureNumeric(ExpressionValue& val, bool evaluate) const THROWS(GCodeException); static bool TypeHasNoLiterals(TypeCode t) noexcept; int GetColumn() const noexcept; |