mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
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
This commit is contained in:
+11
-14
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
+35
-31
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
/// @}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user