10
10
11
11
namespace evmone
12
12
{
13
- namespace
14
- {
15
- using JumpdestMap = std::vector<bool >;
16
-
17
13
JumpdestMap build_jumpdest_map (const uint8_t * code, size_t code_size)
18
14
{
19
15
JumpdestMap m (code_size);
@@ -23,11 +19,13 @@ JumpdestMap build_jumpdest_map(const uint8_t* code, size_t code_size)
23
19
if (op == OP_JUMPDEST)
24
20
m[i] = true ;
25
21
else if (op >= OP_PUSH1 && op <= OP_PUSH32)
26
- i += static_cast < size_t >( op - OP_PUSH1 + 1 ) ;
22
+ i += op - size_t { OP_PUSH1 - 1 } ;
27
23
}
28
24
return m;
29
25
}
30
26
27
+ namespace
28
+ {
31
29
const uint8_t * op_jump (ExecutionState& state, const JumpdestMap& jumpdest_map) noexcept
32
30
{
33
31
const auto dst = state.stack .pop ();
@@ -96,19 +94,19 @@ evmc_result baseline_execute(evmc_vm* /*vm*/, const evmc_host_interface* host,
96
94
evmc_host_context* ctx, evmc_revision rev, const evmc_message* msg, const uint8_t * code,
97
95
size_t code_size) noexcept
98
96
{
97
+ const auto jumpdest_map = build_jumpdest_map (code, code_size);
99
98
auto state = std::make_unique<ExecutionState>(*msg, rev, *host, ctx, code, code_size);
100
- return baseline_execute (*state);
99
+ return baseline_execute (*state, jumpdest_map );
101
100
}
102
101
103
- evmc_result baseline_execute (ExecutionState& state) noexcept
102
+ evmc_result baseline_execute (ExecutionState& state, const JumpdestMap& jumpdest_map ) noexcept
104
103
{
105
104
const auto rev = state.rev ;
106
105
const auto code = state.code .data ();
107
106
const auto code_size = state.code .size ();
108
107
109
108
const auto instruction_names = evmc_get_instruction_names_table (rev);
110
109
const auto instruction_metrics = evmc_get_instruction_metrics_table (rev);
111
- const auto jumpdest_map = build_jumpdest_map (code, code_size);
112
110
113
111
const auto code_end = code + code_size;
114
112
auto * pc = code;
0 commit comments