Fixes #5051 (introduced in #4684), effectively allowing underscores in address literals.

This commit is contained in:
Christian Parpart
2018-10-02 15:37:15 +02:00
committed by Christian Parpart
parent 7609710d4f
commit 9fb835b710
5 changed files with 14 additions and 6 deletions
+8 -3
View File
@@ -633,6 +633,11 @@ IdentifierAnnotation& Identifier::annotation() const
return dynamic_cast<IdentifierAnnotation&>(*m_annotation);
}
ASTString Literal::valueWithoutUnderscores() const
{
return boost::erase_all_copy(value(), "_");
}
bool Literal::isHexNumber() const
{
if (token() != Token::Number)
@@ -648,20 +653,20 @@ bool Literal::looksLikeAddress() const
if (!isHexNumber())
return false;
return abs(int(value().length()) - 42) <= 1;
return abs(int(valueWithoutUnderscores().length()) - 42) <= 1;
}
bool Literal::passesAddressChecksum() const
{
solAssert(isHexNumber(), "Expected hex number");
return dev::passesAddressChecksum(value(), true);
return dev::passesAddressChecksum(valueWithoutUnderscores(), true);
}
string Literal::getChecksummedAddress() const
{
solAssert(isHexNumber(), "Expected hex number");
/// Pad literal to be a proper hex address.
string address = value().substr(2);
string address = valueWithoutUnderscores().substr(2);
if (address.length() > 40)
return string();
address.insert(address.begin(), 40 - address.size(), '0');
+2
View File
@@ -1679,6 +1679,8 @@ public:
/// @returns the non-parsed value of the literal
ASTString const& value() const { return *m_value; }
ASTString valueWithoutUnderscores() const;
SubDenomination subDenomination() const { return m_subDenomination; }
/// @returns true if this is a number with a hex prefix.
+1 -1
View File
@@ -499,7 +499,7 @@ u256 AddressType::literalValue(Literal const* _literal) const
{
solAssert(_literal, "");
solAssert(_literal->value().substr(0, 2) == "0x", "");
return u256(_literal->value());
return u256(_literal->valueWithoutUnderscores());
}
TypePointer AddressType::unaryOperatorResult(Token::Value _operator) const