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:
RJ Catalano
2016-02-18 11:22:52 -06:00
parent fca27b9ea0
commit 7b918a7bc7
14 changed files with 284 additions and 293 deletions
+11 -14
View File
@@ -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;
};
/**
+2 -2
View File
@@ -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;
}
+2 -2
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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);
/// @}