From 8c13c2c84c64001831a9a4dff0bc65f65edd85bb Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Thu, 19 Sep 2019 14:54:18 +0200 Subject: [PATCH] Fix issues with casting when type is the same. --- src/Binder/Binder.cpp | 3 +++ src/Evaluator/EvalValues/EvalValue.hpp | 8 +++++++- src/ScriptTypes/CastResult.hpp | 1 + src/ScriptTypes/FunctionScriptType.hpp | 4 ++++ src/ScriptTypes/ScriptType.hpp | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Binder/Binder.cpp b/src/Binder/Binder.cpp index a9f1f0b..6669cbf 100644 --- a/src/Binder/Binder.cpp +++ b/src/Binder/Binder.cpp @@ -748,6 +748,9 @@ namespace Porygon::Binder { this->_scriptData->Diagnostics->LogInfo(Diagnostics::DiagnosticCode::UnvalidatedCast, exp->GetStartPosition(), exp->GetLength()); } + else if (castResult == CastResult::Unchanged){ + return toCastParameter; + } return new BoundCastExpression(toCastParameter, destinationType); } diff --git a/src/Evaluator/EvalValues/EvalValue.hpp b/src/Evaluator/EvalValues/EvalValue.hpp index f6bc804..63fab40 100644 --- a/src/Evaluator/EvalValues/EvalValue.hpp +++ b/src/Evaluator/EvalValues/EvalValue.hpp @@ -100,7 +100,13 @@ namespace Porygon::Evaluation { [[nodiscard]] virtual EvalValue* Cast(shared_ptr castType) const{ - throw new EvaluationException("Casting to invalid type."); + if (castType->GetClass() == this->GetTypeClass()){ + return this->Clone(); + } + std::stringstream s; + s << "Casting to invalid type. From: " << this->ToString(); + s << ". To: " << castType->ToString(); + throw EvaluationException(s.str()); } virtual std::string ToString() const{ diff --git a/src/ScriptTypes/CastResult.hpp b/src/ScriptTypes/CastResult.hpp index 0ef85a3..61fa05c 100644 --- a/src/ScriptTypes/CastResult.hpp +++ b/src/ScriptTypes/CastResult.hpp @@ -7,6 +7,7 @@ namespace Porygon{ InvalidCast, UncheckedCast, DataLoss, + Unchanged, }; } diff --git a/src/ScriptTypes/FunctionScriptType.hpp b/src/ScriptTypes/FunctionScriptType.hpp index e640ef5..8414835 100644 --- a/src/ScriptTypes/FunctionScriptType.hpp +++ b/src/ScriptTypes/FunctionScriptType.hpp @@ -55,6 +55,10 @@ namespace Porygon { diagnostics->LogWarning(Diagnostics::DiagnosticCode::DataLossOnCast, parameter->GetStartPosition(), parameter->GetLength()); } + else if(castResult == CastResult::Unchanged){ + parameters->at(i) = parameter; + continue; + } parameters->at(i) = new Binder::BoundCastExpression(parameter, _parameterTypes[i]); } } diff --git a/src/ScriptTypes/ScriptType.hpp b/src/ScriptTypes/ScriptType.hpp index 3d20a43..f626ad7 100644 --- a/src/ScriptTypes/ScriptType.hpp +++ b/src/ScriptTypes/ScriptType.hpp @@ -115,7 +115,7 @@ namespace Porygon{ [[nodiscard]] CastResult CastableTo(const shared_ptr& castType, bool explicitCast) const final{ if (this->operator==(castType)) - return CastResult ::ValidCast; + return CastResult ::Unchanged; if (!explicitCast){ if (castType->GetClass() != TypeClass::Number ) return CastResult::InvalidCast;