15 evmc_revision toRevision(EVMSchedule
const& _schedule) noexcept
17 if (_schedule.haveCreate2 && !_schedule.eip1283Mode)
18 return EVMC_CONSTANTINOPLE2;
19 if (_schedule.haveCreate2 && _schedule.eip1283Mode)
20 return EVMC_CONSTANTINOPLE;
21 if (_schedule.haveRevert)
22 return EVMC_BYZANTIUM;
23 if (_schedule.eip158Mode)
24 return EVMC_SPURIOUS_DRAGON;
25 if (_schedule.eip150Mode)
26 return EVMC_TANGERINE_WHISTLE;
27 if (_schedule.haveDelegateCall)
28 return EVMC_HOMESTEAD;
33 EVMC::EVMC(evmc_instance* _instance) noexcept : evmc::vm(_instance)
35 assert(_instance !=
nullptr);
36 assert(is_abi_compatible());
41 auto result = set_option(pair.first.c_str(), pair.second.c_str());
44 case EVMC_SET_OPTION_SUCCESS:
46 case EVMC_SET_OPTION_INVALID_NAME:
47 cwarn <<
"Unknown EVMC option '" << pair.first <<
"'";
49 case EVMC_SET_OPTION_INVALID_VALUE:
50 cwarn <<
"Invalid value '" << pair.second <<
"' for EVMC option '" << pair.first <<
"'";
53 cwarn <<
"Unknown error when setting EVMC option '" << pair.first <<
"'";
63 constexpr int64_t int64max = std::numeric_limits<int64_t>::max();
68 assert(io_gas <= int64max);
70 assert(_ext.
depth <=
static_cast<size_t>(std::numeric_limits<int32_t>::max()));
72 auto gas =
static_cast<int64_t
>(io_gas);
75 evmc_call_kind
kind = _ext.
isCreate ? EVMC_CREATE : EVMC_CALL;
76 uint32_t flags = _ext.
staticCall ? EVMC_STATIC : 0;
77 assert(flags != EVMC_STATIC ||
kind == EVMC_CALL);
81 auto r = execute(_ext, mode, msg, _ext.
code.data(), _ext.
code.size());
83 auto output =
owning_bytes_ref{{&r.output_data[0], &r.output_data[r.output_size]}, 0, r.output_size};
85 switch (r.status_code)
99 case EVMC_INVALID_INSTRUCTION:
100 case EVMC_UNDEFINED_INSTRUCTION:
103 case EVMC_BAD_JUMP_DESTINATION:
106 case EVMC_STACK_OVERFLOW:
109 case EVMC_STACK_UNDERFLOW:
112 case EVMC_INVALID_MEMORY_ACCESS:
113 BOOST_THROW_EXCEPTION(BufferOverrun());
115 case EVMC_STATIC_MODE_VIOLATION:
116 BOOST_THROW_EXCEPTION(DisallowedStateChange());
119 cwarn <<
"Execution rejected by EVMC, executing with default VM implementation";
122 case EVMC_INTERNAL_ERROR:
124 if (r.status_code <= EVMC_INTERNAL_ERROR)