aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLefteris Karapetsas <lefteris@refu.co>2015-01-20 00:00:23 +0800
committerLefteris Karapetsas <lefteris@refu.co>2015-01-20 00:13:18 +0800
commitab4178941b1f1d99bf266cd0a27d79a27162513a (patch)
treed1bcc1c293e9a551f41495eda567a2b3b10243fc
parent933d65e9863e4f1d57500ccba85e6cde116d962a (diff)
downloaddexon-solidity-ab4178941b1f1d99bf266cd0a27d79a27162513a.tar.gz
dexon-solidity-ab4178941b1f1d99bf266cd0a27d79a27162513a.tar.zst
dexon-solidity-ab4178941b1f1d99bf266cd0a27d79a27162513a.zip
Adding blockhash test in Solidity ExpressionCompiler
-rw-r--r--SolidityExpressionCompiler.cpp25
-rw-r--r--solidityExecutionFramework.h10
2 files changed, 24 insertions, 11 deletions
diff --git a/SolidityExpressionCompiler.cpp b/SolidityExpressionCompiler.cpp
index 579af5bb..d50dc253 100644
--- a/SolidityExpressionCompiler.cpp
+++ b/SolidityExpressionCompiler.cpp
@@ -86,13 +86,19 @@ Declaration const& resolveDeclaration(vector<string> const& _namespacedName,
}
bytes compileFirstExpression(const string& _sourceCode, vector<vector<string>> _functions = {},
- vector<vector<string>> _localVariables = {})
+ vector<vector<string>> _localVariables = {}, vector<shared_ptr<MagicVariableDeclaration const>> _globalDeclarations = {})
{
Parser parser;
ASTPointer<SourceUnit> sourceUnit;
BOOST_REQUIRE_NO_THROW(sourceUnit = parser.parse(make_shared<Scanner>(CharStream(_sourceCode))));
- NameAndTypeResolver resolver({});
+
+ vector<Declaration const*> declarations;
+ declarations.reserve(_globalDeclarations.size() + 1);
+ for (ASTPointer<Declaration const> const& variable: _globalDeclarations)
+ declarations.push_back(variable.get());
+ NameAndTypeResolver resolver(declarations);
resolver.registerDeclarations(*sourceUnit);
+
for (ASTPointer<ASTNode> const& node: sourceUnit->getNodes())
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
{
@@ -390,6 +396,21 @@ BOOST_AUTO_TEST_CASE(intermediately_overflowing_literals)
BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
}
+BOOST_AUTO_TEST_CASE(blockhash)
+{
+ char const* sourceCode = "contract test {\n"
+ " function f() {\n"
+ " block.blockhash(3);\n"
+ " }\n"
+ "}\n";
+ bytes code = compileFirstExpression(sourceCode, {}, {},
+ {make_shared<MagicVariableDeclaration>("block", make_shared<MagicType>(MagicType::Kind::BLOCK))});
+
+ bytes expectation({byte(eth::Instruction::PUSH1), 0x03,
+ byte(eth::Instruction::BLOCKHASH)});
+ BOOST_CHECK_EQUAL_COLLECTIONS(code.begin(), code.end(), expectation.begin(), expectation.end());
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/solidityExecutionFramework.h b/solidityExecutionFramework.h
index 1160d046..1aea61fe 100644
--- a/solidityExecutionFramework.h
+++ b/solidityExecutionFramework.h
@@ -29,7 +29,6 @@
#include <libethereum/State.h>
#include <libethereum/Executive.h>
#include <libsolidity/CompilerStack.h>
-#include "TestHelper.h"
namespace dev
{
@@ -129,12 +128,6 @@ public:
return bytes();
}
- eth::LastHashes setCurrentBlockNumber(u256 _currentBlockNumber)
- {
- m_lastHashes = dev::test::lastHashes(_currentBlockNumber);
- return m_lastHashes;
- }
-
private:
template <class CppFunction, class... Args>
auto callCppAndEncodeResult(CppFunction const& _cppFunction, Args const&... _arguments)
@@ -153,7 +146,7 @@ private:
void sendMessage(bytes const& _data, bool _isCreation, u256 const& _value = 0)
{
m_state.addBalance(m_sender, _value); // just in case
- eth::Executive executive(m_state, m_lastHashes, 0);
+ eth::Executive executive(m_state, eth::LastHashes(), 0);
eth::Transaction t = _isCreation ? eth::Transaction(_value, m_gasPrice, m_gas, _data, 0, KeyPair::create().sec())
: eth::Transaction(_value, m_gasPrice, m_gas, m_contractAddress, _data, 0, KeyPair::create().sec());
bytes transactionRLP = t.rlp();
@@ -191,7 +184,6 @@ protected:
u256 const m_gas = 1000000;
bytes m_output;
eth::LogEntries m_logs;
- eth::LastHashes m_lastHashes;
};
}