@@ -33,84 +33,70 @@ evmc_capabilities_flagset getCapabilities(evmc_instance* _instance) noexcept
3333 return EVMC_CAPABILITY_EVM1;
3434}
3535
36- void delete_output (const evmc_result* result)
37- {
38- delete[] result->output_data ;
39- }
40-
4136evmc_result execute (evmc_instance* _instance, evmc_context* _context, evmc_revision _rev,
4237 const evmc_message* _msg, uint8_t const * _code, size_t _codeSize) noexcept
4338{
4439 (void )_instance;
4540 std::unique_ptr<dev::eth::VM> vm{new dev::eth::VM};
4641
47- evmc_result result = {};
42+ evmc_status_code status_code{};
43+ int64_t gas_left = 0 ;
4844 dev::eth::owning_bytes_ref output;
4945
5046 try
5147 {
5248 output = vm->exec (_context, _rev, _msg, _code, _codeSize);
53- result. status_code = EVMC_SUCCESS;
54- result. gas_left = vm->m_io_gas ;
49+ status_code = EVMC_SUCCESS;
50+ gas_left = vm->m_io_gas ;
5551 }
5652 catch (dev::eth::RevertInstruction& ex)
5753 {
58- result. status_code = EVMC_REVERT;
59- result. gas_left = vm->m_io_gas ;
54+ status_code = EVMC_REVERT;
55+ gas_left = vm->m_io_gas ;
6056 output = ex.output (); // This moves the output from the exception!
6157 }
6258 catch (dev::eth::InvalidInstruction const &)
6359 {
64- result. status_code = EVMC_INVALID_INSTRUCTION;
60+ status_code = EVMC_INVALID_INSTRUCTION;
6561 }
6662 catch (dev::eth::BadInstruction const &)
6763 {
68- result. status_code = EVMC_UNDEFINED_INSTRUCTION;
64+ status_code = EVMC_UNDEFINED_INSTRUCTION;
6965 }
7066 catch (dev::eth::OutOfStack const &)
7167 {
72- result. status_code = EVMC_STACK_OVERFLOW;
68+ status_code = EVMC_STACK_OVERFLOW;
7369 }
7470 catch (dev::eth::StackUnderflow const &)
7571 {
76- result. status_code = EVMC_STACK_UNDERFLOW;
72+ status_code = EVMC_STACK_UNDERFLOW;
7773 }
7874 catch (dev::eth::BufferOverrun const &)
7975 {
80- result. status_code = EVMC_INVALID_MEMORY_ACCESS;
76+ status_code = EVMC_INVALID_MEMORY_ACCESS;
8177 }
8278 catch (dev::eth::OutOfGas const &)
8379 {
84- result. status_code = EVMC_OUT_OF_GAS;
80+ status_code = EVMC_OUT_OF_GAS;
8581 }
8682 catch (dev::eth::BadJumpDestination const &)
8783 {
88- result. status_code = EVMC_BAD_JUMP_DESTINATION;
84+ status_code = EVMC_BAD_JUMP_DESTINATION;
8985 }
9086 catch (dev::eth::DisallowedStateChange const &)
9187 {
92- result. status_code = EVMC_STATIC_MODE_VIOLATION;
88+ status_code = EVMC_STATIC_MODE_VIOLATION;
9389 }
9490 catch (dev::eth::VMException const &)
9591 {
96- result. status_code = EVMC_FAILURE;
92+ status_code = EVMC_FAILURE;
9793 }
9894 catch (...)
9995 {
100- result.status_code = EVMC_INTERNAL_ERROR;
101- }
102-
103- if (!output.empty ())
104- {
105- // Make a copy of the output.
106- auto outputData = new uint8_t [output.size ()];
107- std::memcpy (outputData, output.data (), output.size ());
108- result.output_data = outputData;
109- result.output_size = output.size ();
110- result.release = delete_output;
96+ status_code = EVMC_INTERNAL_ERROR;
11197 }
11298
113- return result ;
99+ return evmc::make_result (status_code, gas_left, output. data (), output. size ()) ;
114100}
115101} // namespace
116102
0 commit comments