aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGav Wood <i@gavwood.com>2015-01-16 02:59:35 +0800
committerGav Wood <i@gavwood.com>2015-01-16 02:59:35 +0800
commit911916beb7d8fd9c318d43fdf137727d364a95d2 (patch)
tree21ab383a6cc9e08247085146e6936668c6a98a03
parent80eec8b308e8af3b742e3da47ded927e4e4b388d (diff)
downloaddexon-solidity-911916beb7d8fd9c318d43fdf137727d364a95d2.tar.gz
dexon-solidity-911916beb7d8fd9c318d43fdf137727d364a95d2.tar.zst
dexon-solidity-911916beb7d8fd9c318d43fdf137727d364a95d2.zip
Add blockhash to Solidity.
Autopadding fix.
-rw-r--r--ExpressionCompiler.cpp7
-rw-r--r--Types.cpp4
-rw-r--r--Types.h2
3 files changed, 10 insertions, 3 deletions
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp
index 1c02f4f3..29338b69 100644
--- a/ExpressionCompiler.cpp
+++ b/ExpressionCompiler.cpp
@@ -282,6 +282,13 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
m_context << u256(32) << u256(0) << eth::logInstruction(logNumber);
break;
}
+ case Location::BLOCKHASH:
+ {
+ arguments[0]->accept(*this);
+ appendTypeConversion(*arguments[0]->getType(), *function.getParameterTypes()[0], true);
+ m_context << eth::Instruction::BLOCKHASH;
+ break;
+ }
case Location::ECRECOVER:
case Location::SHA256:
case Location::RIPEMD160:
diff --git a/Types.cpp b/Types.cpp
index 7ca1dc6d..07d6f6bd 100644
--- a/Types.cpp
+++ b/Types.cpp
@@ -656,8 +656,8 @@ MagicType::MagicType(MagicType::Kind _kind):
{
case Kind::BLOCK:
m_members = MemberList({{"coinbase", make_shared<IntegerType>(0, IntegerType::Modifier::ADDRESS)},
- {"timestamp", make_shared<IntegerType >(256)},
- {"prevhash", make_shared<IntegerType>(256, IntegerType::Modifier::HASH)},
+ {"timestamp", make_shared<IntegerType>(256)},
+ {"blockhash", make_shared<FunctionType>(strings{"uint"}, strings{"hash"}, FunctionType::Location::BLOCKHASH)},
{"difficulty", make_shared<IntegerType>(256)},
{"number", make_shared<IntegerType>(256)},
{"gaslimit", make_shared<IntegerType>(256)}});
diff --git a/Types.h b/Types.h
index 1ccdd706..c011928a 100644
--- a/Types.h
+++ b/Types.h
@@ -348,7 +348,7 @@ public:
/// INTERNAL: jump tag, EXTERNAL: contract address + function index,
/// BARE: contract address (non-abi contract call)
/// OTHERS: special virtual function, nothing on the stack
- enum class Location { INTERNAL, EXTERNAL, SEND, SHA3, SUICIDE, ECRECOVER, SHA256, RIPEMD160, LOG0, LOG1, LOG2, LOG3, LOG4, BARE };
+ enum class Location { INTERNAL, EXTERNAL, SEND, SHA3, SUICIDE, ECRECOVER, SHA256, RIPEMD160, LOG0, LOG1, LOG2, LOG3, LOG4, BLOCKHASH, BARE };
virtual Category getCategory() const override { return Category::FUNCTION; }
explicit FunctionType(FunctionDefinition const& _function, bool _isInternal = true);