aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGav Wood <i@gavwood.com>2015-03-05 00:35:23 +0800
committerGav Wood <i@gavwood.com>2015-03-05 00:35:23 +0800
commit5aff9fbde2c33a5bf2edf3e54c421a654a02e90c (patch)
tree1ed8562076d78cdfb6c7ae9e2ee6b3bdf6be09df
parent60c8709d6e633666659b04af1e773b75a686610f (diff)
downloaddexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.tar
dexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.tar.gz
dexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.tar.bz2
dexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.tar.lz
dexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.tar.xz
dexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.tar.zst
dexon-solidity-5aff9fbde2c33a5bf2edf3e54c421a654a02e90c.zip
Add date/time language to solidity.
-rw-r--r--AST.h8
-rw-r--r--ExpressionCompiler.cpp3
-rw-r--r--Parser.cpp9
-rw-r--r--Token.h24
-rw-r--r--Types.cpp19
5 files changed, 53 insertions, 10 deletions
diff --git a/AST.h b/AST.h
index c91c433e..c3c2cd8d 100644
--- a/AST.h
+++ b/AST.h
@@ -1197,7 +1197,13 @@ public:
Wei = Token::SubWei,
Szabo = Token::SubSzabo,
Finney = Token::SubFinney,
- Ether = Token::SubEther
+ Ether = Token::SubEther,
+ Second = Token::SubSecond,
+ Minute = Token::SubMinute,
+ Hour = Token::SubHour,
+ Day = Token::SubDay,
+ Week = Token::SubWeek,
+ Year = Token::SubYear
};
Literal(SourceLocation const& _location, Token::Value _token,
ASTPointer<ASTString> const& _value,
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp
index 619b0673..38d9aac8 100644
--- a/ExpressionCompiler.cpp
+++ b/ExpressionCompiler.cpp
@@ -250,6 +250,9 @@ bool ExpressionCompiler::visit(UnaryOperation const& _unaryOperation)
case Token::BitNot: // ~
m_context << eth::Instruction::NOT;
break;
+ case Token::After: // after
+ m_context << eth::Instruction::TIMESTAMP << eth::Instruction::ADD;
+ break;
case Token::Delete: // delete
solAssert(!!m_currentLValue, "LValue not retrieved.");
m_currentLValue->setToZero(_unaryOperation.getLocation());
diff --git a/Parser.cpp b/Parser.cpp
index 3c88efc7..44d11159 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -822,6 +822,15 @@ ASTPointer<Expression> Parser::parsePrimaryExpression()
expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
break;
}
+ if (Token::isTimeSubdenomination(m_scanner->peekNextToken()))
+ {
+ ASTPointer<ASTString> literal = getLiteralAndAdvance();
+ nodeFactory.markEndPosition();
+ Literal::SubDenomination subdenomination = static_cast<Literal::SubDenomination>(m_scanner->getCurrentToken());
+ m_scanner->next();
+ expression = nodeFactory.createNode<Literal>(token, literal, subdenomination);
+ break;
+ }
// fall-through
case Token::StringLiteral:
nodeFactory.markEndPosition();
diff --git a/Token.h b/Token.h
index 5e4a6317..2997bb49 100644
--- a/Token.h
+++ b/Token.h
@@ -162,7 +162,7 @@ namespace solidity
K(New, "new", 0) \
K(Public, "public", 0) \
K(Private, "private", 0) \
- K(Internal, "internal", 0) \
+ K(Internal, "internal", 0) \
K(Return, "return", 0) \
K(Returns, "returns", 0) \
K(Struct, "struct", 0) \
@@ -171,11 +171,18 @@ namespace solidity
K(While, "while", 0) \
K(Enum, "enum", 0) \
\
- /* Ether subdenominations */ \
- K(SubWei, "wei", 0) \
- K(SubSzabo, "szabo", 0) \
- K(SubFinney, "finney", 0) \
- K(SubEther, "ether", 0) \
+ /* Ether subdenominations */ \
+ K(SubWei, "wei", 0) \
+ K(SubSzabo, "szabo", 0) \
+ K(SubFinney, "finney", 0) \
+ K(SubEther, "ether", 0) \
+ K(SubSecond, "seconds", 0) \
+ K(SubMinute, "minutes", 0) \
+ K(SubHour, "hours", 0) \
+ K(SubDay, "days", 0) \
+ K(SubWeek, "weeks", 0) \
+ K(SubYear, "years", 0) \
+ K(After, "after", 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 */\
K(Int, "int", 0) \
@@ -376,12 +383,13 @@ public:
}
static bool isBitOp(Value op) { return (BitOr <= op && op <= SHR) || op == BitNot; }
- static bool isUnaryOp(Value op) { return (Not <= op && op <= Delete) || op == Add || op == Sub; }
+ static bool isUnaryOp(Value op) { return (Not <= op && op <= Delete) || op == Add || op == Sub || op == After; }
static bool isCountOp(Value op) { return op == Inc || op == Dec; }
static bool isShiftOp(Value op) { return (SHL <= op) && (op <= SHR); }
static bool isVisibilitySpecifier(Value op) { return isVariableVisibilitySpecifier(op) || op == External; }
static bool isVariableVisibilitySpecifier(Value op) { return op == Public || op == Private || op == Internal; }
- static bool isEtherSubdenomination(Value op) { return op == SubWei || op == SubSzabo || op == SubFinney || op == Token::SubEther; }
+ static bool isEtherSubdenomination(Value op) { return op == SubWei || op == SubSzabo || op == SubFinney || op == SubEther; }
+ static bool isTimeSubdenomination(Value op) { return op == SubSecond || op == SubMinute || op == SubHour || op == SubDay || op == SubWeek || op == SubYear; }
// Returns a string corresponding to the JS token string
// (.e., "<" for the token LT) or NULL if the token doesn't
diff --git a/Types.cpp b/Types.cpp
index 22d612cd..2105d629 100644
--- a/Types.cpp
+++ b/Types.cpp
@@ -195,7 +195,8 @@ TypePointer IntegerType::unaryOperatorResult(Token::Value _operator) const
return TypePointer();
// for non-hash integers, we allow +, -, ++ and --
else if (_operator == Token::Add || _operator == Token::Sub ||
- _operator == Token::Inc || _operator == Token::Dec)
+ _operator == Token::Inc || _operator == Token::Dec ||
+ _operator == Token::After)
return shared_from_this();
else
return TypePointer();
@@ -251,6 +252,7 @@ IntegerConstantType::IntegerConstantType(Literal const& _literal)
switch (_literal.getSubDenomination())
{
case Literal::SubDenomination::Wei:
+ case Literal::SubDenomination::Second:
case Literal::SubDenomination::None:
break;
case Literal::SubDenomination::Szabo:
@@ -262,6 +264,21 @@ IntegerConstantType::IntegerConstantType(Literal const& _literal)
case Literal::SubDenomination::Ether:
m_value *= bigint("1000000000000000000");
break;
+ case Literal::SubDenomination::Minute:
+ m_value *= bigint("60");
+ break;
+ case Literal::SubDenomination::Hour:
+ m_value *= bigint("3600");
+ break;
+ case Literal::SubDenomination::Day:
+ m_value *= bigint("86400");
+ break;
+ case Literal::SubDenomination::Week:
+ m_value *= bigint("604800");
+ break;
+ case Literal::SubDenomination::Year:
+ m_value *= bigint("31536000");
+ break;
}
}