aboutsummaryrefslogtreecommitdiffstats
path: root/vm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vm.cpp')
-rw-r--r--vm.cpp77
1 files changed, 53 insertions, 24 deletions
diff --git a/vm.cpp b/vm.cpp
index 8fe378ce..bcd7df9b 100644
--- a/vm.cpp
+++ b/vm.cpp
@@ -20,7 +20,10 @@
* vm test functions.
*/
+#include <chrono>
#include <boost/filesystem.hpp>
+#include <libethereum/Executive.h>
+#include <libevm/VMFactory.h>
#include "vm.h"
using namespace std;
@@ -283,7 +286,20 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
BOOST_REQUIRE(o.count("pre") > 0);
BOOST_REQUIRE(o.count("exec") > 0);
+ auto argc = boost::unit_test::framework::master_test_suite().argc;
+ auto argv = boost::unit_test::framework::master_test_suite().argv;
+
+ for (auto i = 0; i < argc; ++i)
+ {
+ if (std::string(argv[i]) == "--jit")
+ {
+ VMFactory::setKind(VMKind::JIT);
+ break;
+ }
+ }
+
dev::test::FakeExtVM fev;
+
fev.importEnv(o["env"].get_obj());
fev.importState(o["pre"].get_obj());
@@ -298,14 +314,14 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
}
bytes output;
- VM vm(fev.gas);
-
u256 gas;
bool vmExceptionOccured = false;
+ auto startTime = std::chrono::high_resolution_clock::now();
try
{
- output = vm.go(fev, fev.simpleTrace()).toBytes();
- gas = vm.gas();
+ auto vm = eth::VMFactory::create(fev.gas);
+ output = vm->go(fev, fev.simpleTrace()).toBytes();
+ gas = vm->gas();
}
catch (VMException const& _e)
{
@@ -323,6 +339,19 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
BOOST_ERROR("Failed VM Test with Exception: " << _e.what());
}
+ auto endTime = std::chrono::high_resolution_clock::now();
+ for (auto i = 0; i < argc; ++i)
+ {
+ if (std::string(argv[i]) == "--show-times")
+ {
+ auto testDuration = endTime - startTime;
+ cnote << "Execution time: "
+ << std::chrono::duration_cast<std::chrono::milliseconds>(testDuration).count()
+ << " ms";
+ break;
+ }
+ }
+
// delete null entries in storage for the sake of comparison
for (auto &a: fev.addresses)
@@ -370,29 +399,29 @@ void doVMTests(json_spirit::mValue& v, bool _fillin)
test.importCallCreates(o["callcreates"].get_array());
test.sub.logs = importLog(o["logs"].get_array());
- checkOutput(output, o);
+ checkOutput(output, o);
- BOOST_CHECK_EQUAL(toInt(o["gas"]), gas);
-
- auto& expectedAddrs = test.addresses;
- auto& resultAddrs = fev.addresses;
- for (auto&& expectedPair : expectedAddrs)
+ BOOST_CHECK_EQUAL(toInt(o["gas"]), gas);
+
+ auto& expectedAddrs = test.addresses;
+ auto& resultAddrs = fev.addresses;
+ for (auto&& expectedPair : expectedAddrs)
+ {
+ auto& expectedAddr = expectedPair.first;
+ auto resultAddrIt = resultAddrs.find(expectedAddr);
+ if (resultAddrIt == resultAddrs.end())
+ BOOST_ERROR("Missing expected address " << expectedAddr);
+ else
{
- auto& expectedAddr = expectedPair.first;
- auto resultAddrIt = resultAddrs.find(expectedAddr);
- if (resultAddrIt == resultAddrs.end())
- BOOST_ERROR("Missing expected address " << expectedAddr);
- else
- {
- auto& expectedState = expectedPair.second;
- auto& resultState = resultAddrIt->second;
- BOOST_CHECK_MESSAGE(std::get<0>(expectedState) == std::get<0>(resultState), expectedAddr << ": incorrect balance " << std::get<0>(resultState) << ", expected " << std::get<0>(expectedState));
- BOOST_CHECK_MESSAGE(std::get<1>(expectedState) == std::get<1>(resultState), expectedAddr << ": incorrect txCount " << std::get<1>(resultState) << ", expected " << std::get<1>(expectedState));
- BOOST_CHECK_MESSAGE(std::get<3>(expectedState) == std::get<3>(resultState), expectedAddr << ": incorrect code");
-
- checkStorage(std::get<2>(expectedState), std::get<2>(resultState), expectedAddr);
- }
+ auto& expectedState = expectedPair.second;
+ auto& resultState = resultAddrIt->second;
+ BOOST_CHECK_MESSAGE(std::get<0>(expectedState) == std::get<0>(resultState), expectedAddr << ": incorrect balance " << std::get<0>(resultState) << ", expected " << std::get<0>(expectedState));
+ BOOST_CHECK_MESSAGE(std::get<1>(expectedState) == std::get<1>(resultState), expectedAddr << ": incorrect txCount " << std::get<1>(resultState) << ", expected " << std::get<1>(expectedState));
+ BOOST_CHECK_MESSAGE(std::get<3>(expectedState) == std::get<3>(resultState), expectedAddr << ": incorrect code");
+
+ checkStorage(std::get<2>(expectedState), std::get<2>(resultState), expectedAddr);
}
+ }
checkAddresses<std::map<Address, std::tuple<u256, u256, std::map<u256, u256>, bytes> > >(test.addresses, fev.addresses);
BOOST_CHECK(test.callcreates == fev.callcreates);