1010
1111namespace evmone ::baseline
1212{
13- JumpdestMap build_jumpdest_map (const uint8_t * code, size_t code_size)
13+ CodeAnalysis analyze (const uint8_t * code, size_t code_size)
1414{
1515 // To find if op is any PUSH opcode (OP_PUSH1 <= op <= OP_PUSH32)
1616 // it can be noticed that OP_PUSH32 is INT8_MAX (0x7f) therefore
1717 // static_cast<int8_t>(op) <= OP_PUSH32 is always true and can be skipped.
1818 static_assert (OP_PUSH32 == std::numeric_limits<int8_t >::max ());
1919
20- JumpdestMap map (code_size); // Allocate and init bitmap with zeros.
20+ CodeAnalysis:: JumpdestMap map (code_size); // Allocate and init bitmap with zeros.
2121 for (size_t i = 0 ; i < code_size; ++i)
2222 {
2323 const auto op = code[i];
@@ -26,12 +26,13 @@ JumpdestMap build_jumpdest_map(const uint8_t* code, size_t code_size)
2626 else if (INTX_UNLIKELY (op == OP_JUMPDEST))
2727 map[i] = true ;
2828 }
29- return map;
29+ return CodeAnalysis{ std::move ( map)} ;
3030}
3131
3232namespace
3333{
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
3536{
3637 const auto dst = state.stack .pop ();
3738 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,
9899evmc_result execute (evmc_vm* /* vm*/ , const evmc_host_interface* host, evmc_host_context* ctx,
99100 evmc_revision rev, const evmc_message* msg, const uint8_t * code, size_t code_size) noexcept
100101{
101- const auto jumpdest_map = build_jumpdest_map (code, code_size);
102+ const auto jumpdest_map = analyze (code, code_size);
102103 auto state = std::make_unique<ExecutionState>(*msg, rev, *host, ctx, code, code_size);
103104 return execute (*state, jumpdest_map);
104105}
105106
106- evmc_result execute (ExecutionState& state, const JumpdestMap& jumpdest_map ) noexcept
107+ evmc_result execute (ExecutionState& state, const CodeAnalysis& analysis ) noexcept
107108{
108109 const auto rev = state.rev ;
109110 const auto code = state.code .data ();
@@ -381,12 +382,12 @@ evmc_result execute(ExecutionState& state, const JumpdestMap& jumpdest_map) noex
381382 }
382383
383384 case OP_JUMP:
384- pc = op_jump (state, jumpdest_map);
385+ pc = op_jump (state, analysis. jumpdest_map );
385386 continue ;
386387 case OP_JUMPI:
387388 if (state.stack [1 ] != 0 )
388389 {
389- pc = op_jump (state, jumpdest_map);
390+ pc = op_jump (state, analysis. jumpdest_map );
390391 }
391392 else
392393 {
0 commit comments