diff options
author | RJ Catalano <rcatalano@macsales.com> | 2016-02-09 05:43:22 +0800 |
---|---|---|
committer | RJ Catalano <rcatalano@macsales.com> | 2016-02-19 01:22:52 +0800 |
commit | 7b918a7bc7a3c619682266b1c2566dacb9dcc765 (patch) | |
tree | a8763b90b26cafff938c3cbc261fa85627ac4a8a /libsolidity/ast | |
parent | fca27b9ea00eb580f771820e967f62b58478c9a2 (diff) | |
download | dexon-solidity-7b918a7bc7a3c619682266b1c2566dacb9dcc765.tar.gz dexon-solidity-7b918a7bc7a3c619682266b1c2566dacb9dcc765.tar.zst dexon-solidity-7b918a7bc7a3c619682266b1c2566dacb9dcc765.zip |
changes to redefine the token list, the scanner, and the parser and how they pass around variable types of different sizes
not ready for change to FixedPoint just yet
made this more const correct and added a switch statement for easier reading
Diffstat (limited to 'libsolidity/ast')
-rw-r--r-- | libsolidity/ast/AST.h | 25 | ||||
-rw-r--r-- | libsolidity/ast/ASTJsonConverter.cpp | 4 | ||||
-rw-r--r-- | libsolidity/ast/ASTPrinter.cpp | 4 | ||||
-rw-r--r-- | libsolidity/ast/Types.cpp | 66 | ||||
-rw-r--r-- | libsolidity/ast/Types.h | 2 |
5 files changed, 51 insertions, 50 deletions
diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index e1063467..d32d76a4 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -756,18 +756,17 @@ public: class ElementaryTypeName: public TypeName { public: - ElementaryTypeName(SourceLocation const& _location, Token::Value _type): - TypeName(_location), m_type(_type) - { - solAssert(Token::isElementaryTypeName(_type), ""); - } + ElementaryTypeName(SourceLocation const& _location, ElementaryTypeNameToken const& _elem): + TypeName(_location), m_type(_elem) + {} + virtual void accept(ASTVisitor& _visitor) override; virtual void accept(ASTConstVisitor& _visitor) const override; - Token::Value typeName() const { return m_type; } + ElementaryTypeNameToken const& typeName() const { return m_type; } private: - Token::Value m_type; + ElementaryTypeNameToken m_type; }; /** @@ -1408,18 +1407,16 @@ private: class ElementaryTypeNameExpression: public PrimaryExpression { public: - ElementaryTypeNameExpression(SourceLocation const& _location, Token::Value _typeToken): - PrimaryExpression(_location), m_typeToken(_typeToken) - { - solAssert(Token::isElementaryTypeName(_typeToken), ""); - } + ElementaryTypeNameExpression(SourceLocation const& _location, ElementaryTypeNameToken const& _type): + PrimaryExpression(_location), m_typeToken(_type) + {} virtual void accept(ASTVisitor& _visitor) override; virtual void accept(ASTConstVisitor& _visitor) const override; - Token::Value typeToken() const { return m_typeToken; } + ElementaryTypeNameToken const& typeName() const { return m_typeToken; } private: - Token::Value m_typeToken; + ElementaryTypeNameToken m_typeToken; }; /** diff --git a/libsolidity/ast/ASTJsonConverter.cpp b/libsolidity/ast/ASTJsonConverter.cpp index df836afe..163e22f4 100644 --- a/libsolidity/ast/ASTJsonConverter.cpp +++ b/libsolidity/ast/ASTJsonConverter.cpp @@ -139,7 +139,7 @@ bool ASTJsonConverter::visit(TypeName const&) bool ASTJsonConverter::visit(ElementaryTypeName const& _node) { - addJsonNode("ElementaryTypeName", { make_pair("name", Token::toString(_node.typeName())) }); + addJsonNode("ElementaryTypeName", { make_pair("name", _node.typeName().toString()) }); return true; } @@ -297,7 +297,7 @@ bool ASTJsonConverter::visit(Identifier const& _node) bool ASTJsonConverter::visit(ElementaryTypeNameExpression const& _node) { addJsonNode("ElementaryTypenameExpression", - { make_pair("value", Token::toString(_node.typeToken())), make_pair("type", type(_node)) }); + { make_pair("value", _node.typeName().toString()), make_pair("type", type(_node)) }); return true; } diff --git a/libsolidity/ast/ASTPrinter.cpp b/libsolidity/ast/ASTPrinter.cpp index bc981f7d..283bc8f9 100644 --- a/libsolidity/ast/ASTPrinter.cpp +++ b/libsolidity/ast/ASTPrinter.cpp @@ -145,7 +145,7 @@ bool ASTPrinter::visit(TypeName const& _node) bool ASTPrinter::visit(ElementaryTypeName const& _node) { - writeLine(string("ElementaryTypeName ") + Token::toString(_node.typeName())); + writeLine(string("ElementaryTypeName ") + _node.typeName().toString()); printSourcePart(_node); return goDeeper(); } @@ -331,7 +331,7 @@ bool ASTPrinter::visit(Identifier const& _node) bool ASTPrinter::visit(ElementaryTypeNameExpression const& _node) { - writeLine(string("ElementaryTypeNameExpression ") + Token::toString(_node.typeToken())); + writeLine(string("ElementaryTypeNameExpression ") + _node.typeName().toString()); printType(_node); printSourcePart(_node); return goDeeper(); diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index c889e6a0..df96d412 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -115,51 +115,55 @@ u256 const& MemberList::storageSize() const return m_storageOffsets->storageSize(); } -TypePointer Type::fromElementaryTypeName(Token::Value _typeToken) +TypePointer Type::fromElementaryTypeName(ElementaryTypeNameToken const& _type) { - char const* tokenCstr = Token::toString(_typeToken); - solAssert(Token::isElementaryTypeName(_typeToken), - "Expected an elementary type name but got " + ((tokenCstr) ? string(Token::toString(_typeToken)) : "")); + string tokenString = _type.toString(); + solAssert(Token::isElementaryTypeName(_type.returnTok()), + "Expected an elementary type name but got " + tokenString); - if (Token::Int <= _typeToken && _typeToken <= Token::Bytes32) + Token::Value token = _type.returnTok(); + unsigned int M = _type.returnM(); + + switch (token) { - int offset = _typeToken - Token::Int; - int bytes = offset % 33; - if (bytes == 0 && _typeToken != Token::Bytes1) - bytes = 32; - int modifier = offset / 33; - switch(modifier) - { - case 0: - return make_shared<IntegerType>(bytes * 8, IntegerType::Modifier::Signed); - case 1: - return make_shared<IntegerType>(bytes * 8, IntegerType::Modifier::Unsigned); - case 2: - return make_shared<FixedBytesType>(bytes + 1); - default: - solAssert(false, "Unexpected modifier value. Should never happen"); - return TypePointer(); - } - } - else if (_typeToken == Token::Byte) + case Token::IntM: + return make_shared<IntegerType>(M, IntegerType::Modifier::Signed); + case Token::UIntM: + return make_shared<IntegerType>(M, IntegerType::Modifier::Unsigned); + case Token::BytesM: + return make_shared<FixedBytesType>(M); + case Token::Int: + return make_shared<IntegerType>(256, IntegerType::Modifier::Signed); + case Token::UInt: + return make_shared<IntegerType>(256, IntegerType::Modifier::Unsigned); + case Token::Byte: return make_shared<FixedBytesType>(1); - else if (_typeToken == Token::Address) + case Token::Address: return make_shared<IntegerType>(0, IntegerType::Modifier::Address); - else if (_typeToken == Token::Bool) + case Token::Bool: return make_shared<BoolType>(); - else if (_typeToken == Token::Bytes) + case Token::Bytes: return make_shared<ArrayType>(DataLocation::Storage); - else if (_typeToken == Token::String) + case Token::String: return make_shared<ArrayType>(DataLocation::Storage, true); - else + //no types found + default: BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment( - "Unable to convert elementary typename " + string(Token::toString(_typeToken)) + " to type." + "Unable to convert elementary typename " + _type.toString() + " to type." )); + } } TypePointer Type::fromElementaryTypeName(string const& _name) { - return fromElementaryTypeName(Token::fromIdentifierOrKeyword(_name)); + string keyword = _name.substr(0, _name.find_first_of("0123456789")); + string info = ""; + if (_name.find_first_of("0123456789") != string::npos) + { + keyword += "M"; + info = _name.substr(_name.find_first_of("0123456789")); + } + return fromElementaryTypeName(ElementaryTypeNameToken(Token::fromIdentifierOrKeyword(keyword), info)); } TypePointer Type::forLiteral(Literal const& _literal) diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 90a0509b..b4a2d573 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -140,7 +140,7 @@ public: /// @{ /// @name Factory functions /// Factory functions that convert an AST @ref TypeName to a Type. - static TypePointer fromElementaryTypeName(Token::Value _typeToken); + static TypePointer fromElementaryTypeName(ElementaryTypeNameToken const& _type); static TypePointer fromElementaryTypeName(std::string const& _name); /// @} |