10
10
11
11
namespace evmone ::baseline
12
12
{
13
- JumpdestMap build_jumpdest_map (const uint8_t * code, size_t code_size)
13
+ CodeAnalysis analyze (const uint8_t * code, size_t code_size)
14
14
{
15
15
// To find if op is any PUSH opcode (OP_PUSH1 <= op <= OP_PUSH32)
16
16
// it can be noticed that OP_PUSH32 is INT8_MAX (0x7f) therefore
17
17
// static_cast<int8_t>(op) <= OP_PUSH32 is always true and can be skipped.
18
18
static_assert (OP_PUSH32 == std::numeric_limits<int8_t >::max ());
19
19
20
- JumpdestMap map (code_size); // Allocate and init bitmap with zeros.
20
+ CodeAnalysis:: JumpdestMap map (code_size); // Allocate and init bitmap with zeros.
21
21
for (size_t i = 0 ; i < code_size; ++i)
22
22
{
23
23
const auto op = code[i];
@@ -26,12 +26,13 @@ JumpdestMap build_jumpdest_map(const uint8_t* code, size_t code_size)
26
26
else if (INTX_UNLIKELY (op == OP_JUMPDEST))
27
27
map[i] = true ;
28
28
}
29
- return map;
29
+ return CodeAnalysis{ std::move ( map)} ;
30
30
}
31
31
32
32
namespace
33
33
{
34
- const uint8_t * op_jump (ExecutionState& state, const JumpdestMap& jumpdest_map) noexcept
34
+ const uint8_t * op_jump (
35
+ ExecutionState& state, const CodeAnalysis::JumpdestMap& jumpdest_map) noexcept
35
36
{
36
37
const auto dst = state.stack .pop ();
37
38
if (dst >= jumpdest_map.size () || !jumpdest_map[static_cast <size_t >(dst)])
@@ -98,12 +99,12 @@ inline evmc_status_code check_requirements(const char* const* instruction_names,
98
99
evmc_result execute (evmc_vm* /* vm*/ , const evmc_host_interface* host, evmc_host_context* ctx,
99
100
evmc_revision rev, const evmc_message* msg, const uint8_t * code, size_t code_size) noexcept
100
101
{
101
- const auto jumpdest_map = build_jumpdest_map (code, code_size);
102
+ const auto jumpdest_map = analyze (code, code_size);
102
103
auto state = std::make_unique<ExecutionState>(*msg, rev, *host, ctx, code, code_size);
103
104
return execute (*state, jumpdest_map);
104
105
}
105
106
106
- evmc_result execute (ExecutionState& state, const JumpdestMap& jumpdest_map ) noexcept
107
+ evmc_result execute (ExecutionState& state, const CodeAnalysis& analysis ) noexcept
107
108
{
108
109
const auto rev = state.rev ;
109
110
const auto code = state.code .data ();
@@ -381,12 +382,12 @@ evmc_result execute(ExecutionState& state, const JumpdestMap& jumpdest_map) noex
381
382
}
382
383
383
384
case OP_JUMP:
384
- pc = op_jump (state, jumpdest_map);
385
+ pc = op_jump (state, analysis. jumpdest_map );
385
386
continue ;
386
387
case OP_JUMPI:
387
388
if (state.stack [1 ] != 0 )
388
389
{
389
- pc = op_jump (state, jumpdest_map);
390
+ pc = op_jump (state, analysis. jumpdest_map );
390
391
}
391
392
else
392
393
{
0 commit comments