From fdc1573b79525244f90c45c4d859235b52ae63a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 2 Jul 2019 13:14:44 +0200 Subject: [PATCH] Do not export and allow inlining of find_jumpdest --- lib/evmone/analysis.cpp | 11 ----------- lib/evmone/analysis.hpp | 14 +++++++++++--- lib/evmone/instructions.cpp | 2 +- test/unittests/analysis_test.cpp | 4 ++-- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/evmone/analysis.cpp b/lib/evmone/analysis.cpp index b7cea2a910..a3047a7567 100644 --- a/lib/evmone/analysis.cpp +++ b/lib/evmone/analysis.cpp @@ -17,17 +17,6 @@ bool is_terminator(uint8_t c) noexcept } } // namespace -int code_analysis::find_jumpdest(int offset) const noexcept -{ - // TODO: Replace with lower_bound(). - for (const auto& d : jumpdest_map) - { - if (d.first == offset) - return d.second; - } - return -1; -} - evmc_call_kind op2call_kind(uint8_t opcode) noexcept { switch (opcode) diff --git a/lib/evmone/analysis.hpp b/lib/evmone/analysis.hpp index ef15eda4bb..9d1bf9dd86 100644 --- a/lib/evmone/analysis.hpp +++ b/lib/evmone/analysis.hpp @@ -153,11 +153,19 @@ struct code_analysis std::deque args_storage; std::vector> jumpdest_map; - - // TODO: Exported for unit tests. Rework unit tests? - EVMC_EXPORT int find_jumpdest(int offset) const noexcept; }; +inline int find_jumpdest(const code_analysis& analysis, int offset) noexcept +{ + // TODO: Replace with lower_bound(). + for (const auto& d : analysis.jumpdest_map) + { + if (d.first == offset) + return d.second; + } + return -1; +} + EVMC_EXPORT code_analysis analyze( const exec_fn_table& fns, evmc_revision rev, const uint8_t* code, size_t code_size) noexcept; diff --git a/lib/evmone/instructions.cpp b/lib/evmone/instructions.cpp index 55df30b0c8..8dbade886f 100644 --- a/lib/evmone/instructions.cpp +++ b/lib/evmone/instructions.cpp @@ -481,7 +481,7 @@ void op_jump(execution_state& state, instr_argument) noexcept const auto dst = state.stack.pop(); auto pc = -1; if (std::numeric_limits::max() < dst || - (pc = state.analysis->find_jumpdest(static_cast(dst))) < 0) + (pc = find_jumpdest(*state.analysis, static_cast(dst))) < 0) return state.exit(EVMC_BAD_JUMP_DESTINATION); state.next_instr = &state.analysis->instrs[static_cast(pc)]; diff --git a/test/unittests/analysis_test.cpp b/test/unittests/analysis_test.cpp index d2baf43b01..4a105438d0 100644 --- a/test/unittests/analysis_test.cpp +++ b/test/unittests/analysis_test.cpp @@ -88,8 +88,8 @@ TEST(analysis, jump1) ASSERT_EQ(analysis.blocks.size(), 3); ASSERT_EQ(analysis.jumpdest_map.size(), 1); EXPECT_EQ(analysis.jumpdest_map[0], std::pair(6, 5)); - EXPECT_EQ(analysis.find_jumpdest(6), 5); - EXPECT_EQ(analysis.find_jumpdest(0), -1); + EXPECT_EQ(find_jumpdest(analysis, 6), 5); + EXPECT_EQ(find_jumpdest(analysis, 0), -1); } TEST(analysis, empty)