diff options
-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); |