diff options
author | Gav Wood <i@gavwood.com> | 2015-01-16 02:59:35 +0800 |
---|---|---|
committer | Gav Wood <i@gavwood.com> | 2015-01-16 02:59:35 +0800 |
commit | 911916beb7d8fd9c318d43fdf137727d364a95d2 (patch) | |
tree | 21ab383a6cc9e08247085146e6936668c6a98a03 | |
parent | 80eec8b308e8af3b742e3da47ded927e4e4b388d (diff) | |
download | dexon-solidity-911916beb7d8fd9c318d43fdf137727d364a95d2.tar.gz dexon-solidity-911916beb7d8fd9c318d43fdf137727d364a95d2.tar.zst dexon-solidity-911916beb7d8fd9c318d43fdf137727d364a95d2.zip |
Add blockhash to Solidity.
Autopadding fix.
-rw-r--r-- | ExpressionCompiler.cpp | 7 | ||||
-rw-r--r-- | Types.cpp | 4 | ||||
-rw-r--r-- | Types.h | 2 |
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: @@ -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)}}); @@ -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); |