aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/ast
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2016-05-10 19:31:10 +0800
committerchriseth <c@ethdev.com>2016-05-11 01:40:37 +0800
commit02e1c9be0d03f4dd576792dbab7c8f6abca86a5e (patch)
tree4919a979fb89918d62ebe68a76f67c4f069169ad /libsolidity/ast
parent4dfe9a216cd9545e6246d68916a759b0187feab1 (diff)
downloaddexon-solidity-02e1c9be0d03f4dd576792dbab7c8f6abca86a5e.tar.gz
dexon-solidity-02e1c9be0d03f4dd576792dbab7c8f6abca86a5e.tar.zst
dexon-solidity-02e1c9be0d03f4dd576792dbab7c8f6abca86a5e.zip
Cleanup.
Diffstat (limited to 'libsolidity/ast')
-rw-r--r--libsolidity/ast/Types.cpp33
1 files changed, 19 insertions, 14 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index c5bb77f6..924ad3b7 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -552,7 +552,7 @@ bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const
{
// We disallow implicit conversion if we would have to truncate (fixedPointType()
// can return a type that requires truncation).
- rational value = m_value * boost::multiprecision::pow(bigint(2), fixed->fractionalBits());
+ rational value = m_value * (bigint(1) << fixed->fractionalBits());
return value.denominator() == 1 && fixed->isImplicitlyConvertibleTo(_convertTo);
}
return false;
@@ -711,18 +711,23 @@ string RationalNumberType::toString(bool) const
u256 RationalNumberType::literalValue(Literal const*) const
{
+ // We ignore the literal and hope that the type was correctly determined to represent
+ // its value.
+
u256 value;
bigint shiftedValue;
- if (m_value.denominator() != 1)
+ if (m_value.denominator() == 1)
+ shiftedValue = m_value.numerator();
+ else
{
- rational temporaryValue = m_value;
auto fixed = fixedPointType();
- temporaryValue *= boost::multiprecision::pow(bigint(2), fixed->fractionalBits());
- shiftedValue = temporaryValue.numerator() / temporaryValue.denominator();
+ solAssert(!!fixed, "");
+ rational shifted = m_value * (bigint(1) << fixed->fractionalBits());
+ // truncate
+ shiftedValue = shifted.numerator() / shifted.denominator();
}
- else
- shiftedValue = integerPart();
+
// we ignore the literal and hope that the type was correctly determined
solAssert(shiftedValue <= u256(-1), "Integer constant too large.");
solAssert(shiftedValue >= -(bigint(1) << 255), "Number constant too small.");
@@ -742,7 +747,6 @@ TypePointer RationalNumberType::mobileType() const
return fixedPointType();
}
-//TODO: combine integerType() and fixedPointType() into one function
shared_ptr<IntegerType const> RationalNumberType::integerType() const
{
solAssert(m_value.denominator() == 1, "integerType() called for fractional number.");
@@ -762,13 +766,12 @@ shared_ptr<IntegerType const> RationalNumberType::integerType() const
shared_ptr<FixedPointType const> RationalNumberType::fixedPointType() const
{
bool negative = (m_value < 0);
- bigint fillRationalBits = bigint(1) << 256; //use this because rationals don't have bit ops
unsigned fractionalBits = 0;
unsigned integerBits = 0;
- rational value = abs(m_value); //convert to absolute value of same type for byte requirements
+ rational value = abs(m_value); // We care about the sign later.
rational maxValue = negative ?
- rational(fillRationalBits) / 2:
- rational(fillRationalBits) - 1;
+ rational(bigint(1) << 255):
+ rational((bigint(1) << 256) - 1);
while (value * 0x100 <= maxValue && value.denominator() != 1 && fractionalBits < 256)
{
@@ -781,7 +784,9 @@ shared_ptr<FixedPointType const> RationalNumberType::fixedPointType() const
// u256(v) is the actual value that will be put on the stack
// From here on, very similar to integerType()
bigint v = value.numerator() / value.denominator();
- if (negative) //convert back to negative number and then shift into a positive number of equal size
+ if (negative)
+ // modify value to satisfy bit requirements for negative numbers:
+ // add one bit for sign and decrement because negative numbers can be larger
v = (v - 1) << 1;
if (v > u256(-1))
@@ -793,7 +798,7 @@ shared_ptr<FixedPointType const> RationalNumberType::fixedPointType() const
if (integerBits > 256 || fractionalBits > 256 || fractionalBits + integerBits > 256)
return shared_ptr<FixedPointType const>();
- if (integerBits + fractionalBits == 0)
+ if (integerBits == 0 && fractionalBits == 0)
{
integerBits = 0;
fractionalBits = 8;