mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Adding ether subdenominations after constan literals
This commit is contained in:
parent
db263bd9d7
commit
dca5f7b57b
11
AST.cpp
11
AST.cpp
@ -594,6 +594,17 @@ void ElementaryTypeNameExpression::checkTypeRequirements()
|
||||
m_type = make_shared<TypeType>(Type::fromElementaryTypeName(m_typeToken));
|
||||
}
|
||||
|
||||
Literal::Literal(Location const& _location, Token::Value _token,
|
||||
ASTPointer<ASTString> const& _value,
|
||||
Token::Value _sub):
|
||||
PrimaryExpression(_location), m_token(_token), m_value(_value)
|
||||
{
|
||||
solAssert(_sub == Token::ILLEGAL || _sub == Token::ETH_SUB_WEI ||
|
||||
_sub == Token::ETH_SUB_SZABO || _sub == Token::ETH_SUB_FINNEY ||
|
||||
_sub == Token::ETH_SUB_ETHER, "Illegal Token::Value given to Literal ctor");
|
||||
m_subDenomination =static_cast<Literal::ethSubDenomination>(_sub);
|
||||
}
|
||||
|
||||
void Literal::checkTypeRequirements()
|
||||
{
|
||||
m_type = Type::forLiteral(*this);
|
||||
|
16
AST.h
16
AST.h
@ -1112,13 +1112,20 @@ private:
|
||||
};
|
||||
|
||||
/**
|
||||
* A literal string or number. @see Type::literalToBigEndian is used to actually parse its value.
|
||||
* A literal string or number. @see ExpressionCompiler::endVisit() is used to actually parse its value.
|
||||
*/
|
||||
class Literal: public PrimaryExpression
|
||||
{
|
||||
public:
|
||||
Literal(Location const& _location, Token::Value _token, ASTPointer<ASTString> const& _value):
|
||||
PrimaryExpression(_location), m_token(_token), m_value(_value) {}
|
||||
enum class ethSubDenomination {
|
||||
NONE = Token::ILLEGAL,
|
||||
WEI = Token::ETH_SUB_WEI,
|
||||
SZABO = Token::ETH_SUB_SZABO,
|
||||
FINNEY = Token::ETH_SUB_FINNEY,
|
||||
ETHER = Token::ETH_SUB_ETHER};
|
||||
Literal(Location const& _location, Token::Value _token,
|
||||
ASTPointer<ASTString> const& _value,
|
||||
Token::Value _sub = Token::ILLEGAL);
|
||||
virtual void accept(ASTVisitor& _visitor) override;
|
||||
virtual void accept(ASTConstVisitor& _visitor) const override;
|
||||
virtual void checkTypeRequirements() override;
|
||||
@ -1127,9 +1134,12 @@ public:
|
||||
/// @returns the non-parsed value of the literal
|
||||
ASTString const& getValue() const { return *m_value; }
|
||||
|
||||
ethSubDenomination getSubDenomination() const { return m_subDenomination; }
|
||||
|
||||
private:
|
||||
Token::Value m_token;
|
||||
ASTPointer<ASTString> m_value;
|
||||
ethSubDenomination m_subDenomination;
|
||||
};
|
||||
|
||||
/// @}
|
||||
|
@ -180,7 +180,7 @@ ASTPointer<InheritanceSpecifier> Parser::parseInheritanceSpecifier()
|
||||
|
||||
Declaration::Visibility Parser::parseVisibilitySpecifier(Token::Value _token)
|
||||
{
|
||||
Declaration::Visibility visibility;
|
||||
Declaration::Visibility visibility = Declaration::Visibility::DEFAULT;
|
||||
if (_token == Token::PUBLIC)
|
||||
visibility = Declaration::Visibility::PUBLIC;
|
||||
else if (_token == Token::PROTECTED)
|
||||
@ -684,6 +684,7 @@ ASTPointer<Expression> Parser::parsePrimaryExpression()
|
||||
ASTNodeFactory nodeFactory(*this);
|
||||
Token::Value token = m_scanner->getCurrentToken();
|
||||
ASTPointer<Expression> expression;
|
||||
Token::Value nextToken = Token::ILLEGAL;
|
||||
switch (token)
|
||||
{
|
||||
case Token::TRUE_LITERAL:
|
||||
@ -691,9 +692,10 @@ ASTPointer<Expression> Parser::parsePrimaryExpression()
|
||||
expression = nodeFactory.createNode<Literal>(token, getLiteralAndAdvance());
|
||||
break;
|
||||
case Token::NUMBER:
|
||||
nextToken = m_scanner->peekNextToken();
|
||||
case Token::STRING_LITERAL:
|
||||
nodeFactory.markEndPosition();
|
||||
expression = nodeFactory.createNode<Literal>(token, getLiteralAndAdvance());
|
||||
expression = nodeFactory.createNode<Literal>(token, getLiteralAndAdvance(), nextToken);
|
||||
break;
|
||||
case Token::IDENTIFIER:
|
||||
nodeFactory.markEndPosition();
|
||||
|
5
Token.h
5
Token.h
@ -174,6 +174,11 @@ namespace solidity
|
||||
K(WHILE, "while", 0) \
|
||||
\
|
||||
\
|
||||
/* Ether subdenominations */ \
|
||||
K(ETH_SUB_WEI, "wei", 0) \
|
||||
K(ETH_SUB_SZABO, "szabo", 0) \
|
||||
K(ETH_SUB_FINNEY, "finney", 0) \
|
||||
K(ETH_SUB_ETHER, "ether", 0) \
|
||||
/* type keywords, keep them in this order, keep int as first keyword
|
||||
* the implementation in Types.cpp has to be synced to this here
|
||||
* TODO more to be added */ \
|
||||
|
27
Types.cpp
27
Types.cpp
@ -326,15 +326,36 @@ string IntegerConstantType::toString() const
|
||||
return "int_const " + m_value.str();
|
||||
}
|
||||
|
||||
u256 IntegerConstantType::literalValue(Literal const*) const
|
||||
u256 IntegerConstantType::literalValue(Literal const* _literal) const
|
||||
{
|
||||
Literal::ethSubDenomination sub =_literal->getSubDenomination();
|
||||
u256 value;
|
||||
// we ignore the literal and hope that the type was correctly determined
|
||||
solAssert(m_value <= u256(-1), "Integer constant too large.");
|
||||
solAssert(m_value >= -(bigint(1) << 255), "Integer constant too small.");
|
||||
|
||||
|
||||
if (m_value >= 0)
|
||||
return u256(m_value);
|
||||
value = u256(m_value);
|
||||
else
|
||||
return s2u(s256(m_value));
|
||||
value = s2u(s256(m_value));
|
||||
|
||||
switch(sub) {
|
||||
case Literal::ethSubDenomination::WEI:
|
||||
case Literal::ethSubDenomination::NONE:
|
||||
break;
|
||||
case Literal::ethSubDenomination::SZABO:
|
||||
value *= u256(1000000000000);
|
||||
break;
|
||||
case Literal::ethSubDenomination::FINNEY:
|
||||
value *= u256(1000000000000000);
|
||||
break;
|
||||
case Literal::ethSubDenomination::ETHER:
|
||||
value *= u256(1000000000000000000);
|
||||
break;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
shared_ptr<IntegerType const> IntegerConstantType::getIntegerType() const
|
||||
|
Loading…
Reference in New Issue
Block a user