From 063d481bb39a3048ad810e6fb0cc2d24e6bd6724 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 17 Aug 2021 13:50:19 +0200 Subject: [PATCH] Fix parsing fixed point values. --- test/libsolidity/util/BytesUtils.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/libsolidity/util/BytesUtils.cpp b/test/libsolidity/util/BytesUtils.cpp index 3645ab755..25638764e 100644 --- a/test/libsolidity/util/BytesUtils.cpp +++ b/test/libsolidity/util/BytesUtils.cpp @@ -94,12 +94,21 @@ bytes BytesUtils::convertNumber(string const& _literal) bytes BytesUtils::convertFixedPoint(string const& _literal, size_t& o_fractionalDigits) { size_t dotPos = _literal.find('.'); - string valueInteger = _literal.substr(0, dotPos); - string valueFraction = _literal.substr(dotPos + 1); - o_fractionalDigits = valueFraction.length(); + o_fractionalDigits = dotPos < _literal.size() ? _literal.size() - dotPos : 0; + bool negative = !_literal.empty() && _literal.at(0) == '-'; + // remove decimal point + string valueInteger = _literal.substr(0, dotPos) + _literal.substr(dotPos + 1); + // erase leading zeros to avoid parsing as octal. + while (!valueInteger.empty() && (valueInteger.at(0) == '0' || valueInteger.at(0) == '-')) + valueInteger.erase(valueInteger.begin()); + if (valueInteger.empty()) + valueInteger = "0"; try { - return util::toBigEndian(u256(valueInteger + valueFraction)); + u256 value(valueInteger); + if (negative) + value = s2u(-u2s(value)); + return util::toBigEndian(value); } catch (std::exception const&) {