Skip to content
This repository was archived by the owner on Oct 28, 2021. It is now read-only.

Commit b020127

Browse files
committed
interpreter: Use evmc::make_result()
1 parent 78af907 commit b020127

File tree

1 file changed

+17
-31
lines changed

1 file changed

+17
-31
lines changed

libaleth-interpreter/VM.cpp

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
4136
evmc_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

Comments
 (0)