aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Cobb <jason.e.cobb@gmail.com>2018-04-20 07:00:05 +0800
committerAlex Beregszaszi <alex@rtfs.hu>2018-04-21 00:53:42 +0800
commit57003c534ad02f4a3dc596130257333965e3396a (patch)
tree5c3fb8590f5ce92f5cf37a2f575cdbf23d66a3b1
parent72b0412ef68f332c9dcdc66b554aabc3fb69ba59 (diff)
downloaddexon-solidity-57003c534ad02f4a3dc596130257333965e3396a.tar.gz
dexon-solidity-57003c534ad02f4a3dc596130257333965e3396a.tar.zst
dexon-solidity-57003c534ad02f4a3dc596130257333965e3396a.zip
Types changes for fixed points
-rw-r--r--libsolidity/ast/Types.cpp27
-rw-r--r--libsolidity/ast/Types.h3
2 files changed, 17 insertions, 13 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index 425e5045..0a25268b 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -627,8 +627,7 @@ bool FixedPointType::isImplicitlyConvertibleTo(Type const& _convertTo) const
bool FixedPointType::isExplicitlyConvertibleTo(Type const& _convertTo) const
{
return _convertTo.category() == category() ||
- _convertTo.category() == Category::Integer ||
- _convertTo.category() == Category::FixedBytes;
+ (_convertTo.category() == Category::Integer && !dynamic_cast<IntegerType const&>(_convertTo).isAddress());
}
TypePointer FixedPointType::unaryOperatorResult(Token::Value _operator) const
@@ -688,7 +687,12 @@ TypePointer FixedPointType::binaryOperatorResult(Token::Value _operator, TypePoi
_other->category() != Category::Integer
)
return TypePointer();
- auto commonType = Type::commonType(shared_from_this(), _other); //might be fixed point or integer
+
+ if (auto integerType = dynamic_pointer_cast<IntegerType const>(_other))
+ if (integerType->isAddress())
+ return TypePointer();
+
+ auto commonType = Type::commonType(shared_from_this(), _other);
if (!commonType)
return TypePointer();
@@ -696,19 +700,16 @@ TypePointer FixedPointType::binaryOperatorResult(Token::Value _operator, TypePoi
// All fixed types can be compared
if (Token::isCompareOp(_operator))
return commonType;
- if (Token::isBitOp(_operator) || Token::isBooleanOp(_operator))
+ if (Token::isBitOp(_operator) || Token::isBooleanOp(_operator) || _operator == Token::Exp)
return TypePointer();
- if (auto fixType = dynamic_pointer_cast<FixedPointType const>(commonType))
- {
- if (Token::Exp == _operator)
- return TypePointer();
- }
- else if (auto intType = dynamic_pointer_cast<IntegerType const>(commonType))
- if (intType->isAddress())
- return TypePointer();
return commonType;
}
+std::shared_ptr<IntegerType> FixedPointType::asIntegerType() const
+{
+ return std::make_shared<IntegerType>(numBits(), isSigned() ? IntegerType::Modifier::Signed : IntegerType::Modifier::Unsigned);
+}
+
tuple<bool, rational> RationalNumberType::parseRational(string const& _value)
{
rational value;
@@ -1148,7 +1149,7 @@ u256 RationalNumberType::literalValue(Literal const*) const
auto fixed = fixedPointType();
solAssert(fixed, "");
int fractionalDigits = fixed->fractionalDigits();
- shiftedValue = (m_value.numerator() / m_value.denominator()) * pow(bigint(10), fractionalDigits);
+ shiftedValue = m_value.numerator() * pow(bigint(10), fractionalDigits) / m_value.denominator();
}
// we ignore the literal and hope that the type was correctly determined
diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h
index 345f84a1..b41b2235 100644
--- a/libsolidity/ast/Types.h
+++ b/libsolidity/ast/Types.h
@@ -396,6 +396,9 @@ public:
/// smallest value in general.
bigint minIntegerValue() const;
+ /// @returns the smallest integer type that can hold this type with fractional parts shifted to integers.
+ std::shared_ptr<IntegerType> asIntegerType() const;
+
private:
int m_totalBits;
int m_fractionalDigits;