diff options
author | RJ Catalano <rcatalano@macsales.com> | 2016-03-04 02:48:42 +0800 |
---|---|---|
committer | VoR0220 <catalanor0220@gmail.com> | 2016-05-10 00:41:02 +0800 |
commit | 6fa5e0fac93e9eb584daa2c7b637ca37dabc0356 (patch) | |
tree | 2c6228f05b70469daed4189bd8bda4dd742ecf55 | |
parent | 9a075458ad104921c9d747cd34d3e5c299638406 (diff) | |
download | dexon-solidity-6fa5e0fac93e9eb584daa2c7b637ca37dabc0356.tar.gz dexon-solidity-6fa5e0fac93e9eb584daa2c7b637ca37dabc0356.tar.zst dexon-solidity-6fa5e0fac93e9eb584daa2c7b637ca37dabc0356.zip |
Rational implemented...trying to figure out exponential
-rw-r--r-- | libsolidity/ast/Types.cpp | 67 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 32 |
2 files changed, 45 insertions, 54 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index b1a0f4e6..577838fb 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -521,7 +521,6 @@ ConstantNumberType::ConstantNumberType(Literal const& _literal) } else m_value = bigint(_literal.value()); - switch (_literal.subDenomination()) { case Literal::SubDenomination::None: @@ -564,28 +563,14 @@ bool ConstantNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const if (m_value == 0) return true; int forSignBit = (targetType->isSigned() ? 1 : 0); - if (m_scalingFactor == 0) //if current type is integer - { - if (m_value > 0) - { - if (m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) - return true; - } - else if (targetType->isSigned() && -m_value <= (u256(1) << (targetType->numBits() - forSignBit))) - return true; - return false; - } - else if (m_scalingFactor != 0) //if current type is fixed point + if (m_value > 0) { - if (m_value > 0) - { - if (leftOfRadix() <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) - return true; - } - else if (targetType->isSigned() && -leftOfRadix() <= (u256(1) << (targetType->numBits() - forSignBit))) + if (m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit))) return true; - return false; } + else if (targetType->isSigned() && -m_value <= (u256(1) << (targetType->numBits() - forSignBit))) + return true; + return false; } else if (_convertTo.category() == Category::FixedPoint) { @@ -593,35 +578,22 @@ bool ConstantNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const if (m_value == 0) return true; int forSignBit = (targetType->isSigned() ? 1 : 0); - if (m_scalingFactor == 0) //if the current type is an integer, focus on the integer bits + if (m_value > 0) { - if (m_value > 0) - { - if (m_value <= (u256(-1) >> (256 - targetType->integerBits() + forSignBit))) - return true; - } - else if (targetType->isSigned() && -m_value <= (u256(1) << (targetType->integerBits() - forSignBit))) + if ( + m_value <= (u256(-1) >> (256 - targetType->numBits() + forSignBit)) && + m_scalingFactor <= targetType->fractionalBits() + ) return true; - return false; - } - else if (m_scalingFactor != 0) //if the current type is fixed point, focus on both the - { //integer bits and fractional bits and ensure they fit - if (m_value > 0) - { - if ( - leftOfRadix() <= (u256(-1) >> (256 - targetType->integerBits() + forSignBit)) && - rightOfRadix() <= (u256(-1) >> (256 - targetType->fractionalBits() + forSignBit)) - ) - return true; - } else if ( targetType->isSigned() && - -leftOfRadix() <= (u256(1) >> (256 - targetType->integerBits() + forSignBit)) && - -rightOfRadix() <= (u256(1) >> (256 - targetType->fractionalBits() + forSignBit)) + -m_value <= (u256(1) >> (256 - targetType->numBits() + forSignBit)) && + m_scalingFactor <= targetType->fractionalBits() ) return true; return false; } + } else if (_convertTo.category() == Category::FixedPoint) { @@ -738,18 +710,11 @@ TypePointer ConstantNumberType::binaryOperatorResult(Token::Value _operator, Typ value = m_value.numerator() & other.m_value.numerator(); break; case Token::Add: - value = leftOfRadix() + other.leftOfRadix(); - value *= boost::multiprecision::pow(bigint(10), scale); - value += rightOfRadix() + other.rightOfRadix();; + value = m_value + other.m_value; break; case Token::Sub: - value = leftOfRadix() - other.leftOfRadix(); - if (rightOfRadix() < other.rightOfRadix()) - scale = other.m_scalingFactor; - value *= boost::multiprecision::pow(bigint(10), scale); - value += (rightOfRadix() - other.rightOfRadix()); + value = m_value - other.m_value; break; - //these next 4 need to be scaled accordingly if it's a fixed type case Token::Mul: scale = m_scalingFactor - other.m_scalingFactor; value = m_value * other.m_value; @@ -761,7 +726,6 @@ TypePointer ConstantNumberType::binaryOperatorResult(Token::Value _operator, Typ value = m_value / other.m_value; break; case Token::Mod: - { if (other.m_value == 0) return TypePointer(); else if (fixedPointType) @@ -815,7 +779,6 @@ string ConstantNumberType::toString(bool) const { if (m_value.denominator() == 1) return "int_const " + m_value.numerator().str(); - return "rational_const " + m_value.numerator().str() + '/' + m_value.denominator().str(); } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index b3679305..c078dc10 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -3598,8 +3598,9 @@ BOOST_AUTO_TEST_CASE(fixed_type_literal_expression) fixed c = 1.0 / 3.0; ufixed d = 599 + .5367; ufixed e = 35.245 % 12.9; - ufixed g = 1.2 % 2.00000; - //ufixed f = 2.222 ** 3.333; + ufixed f = 1.2 % 2.00000; + //fixed g = 2 ** -1.5; + //fixed h = -3 ** -5.8; } } )"; @@ -3631,6 +3632,19 @@ BOOST_AUTO_TEST_CASE(array_declaration_with_fixed_literal) BOOST_CHECK(!success(text)); } +BOOST_AUTO_TEST_CASE(mapping_with_fixed_literal) +{ + char const* text = R"( + contract test { + mapping(fixed => string) fixedString; + function f() { + fixedString[3.14] = "Pi"; + } + } + )"; + BOOST_CHECK(success(text)); +} + BOOST_AUTO_TEST_CASE(inline_array_fixed_literals) { char const* text = R"( @@ -3657,6 +3671,20 @@ BOOST_AUTO_TEST_CASE(size_capabilities_of_fixed_point_types) BOOST_CHECK(success(text)); } +BOOST_AUTO_TEST_CASE(var_capable_of_holding_fixed_constants) +{ + char const* text = R"( + contract test { + function f() { + var a = 0.12345678; + var b = 12345678.0; + var c = 0.00000009; + } + } + )"; + BOOST_CHECK(success(text)); +} + BOOST_AUTO_TEST_SUITE_END() } |