Skip to content

Commit 926ba87

Browse files
committed
Keep block info in instruction argument
1 parent 421622f commit 926ba87

File tree

5 files changed

+12
-22
lines changed

5 files changed

+12
-22
lines changed

lib/evmone/analysis.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,13 @@ code_analysis analyze(
6666

6767
if (!block || jumpdest)
6868
{
69-
// Create new block.
70-
block = &analysis.blocks.emplace_back();
71-
block_stack_change = 0;
72-
7369
// Create BEGINBLOCK instruction which either replaces JUMPDEST or is injected
7470
// in case there is no JUMPDEST.
7571
auto& beginblock_instr = analysis.instrs.emplace_back(fns[OPX_BEGINBLOCK]);
76-
beginblock_instr.arg.p.number = static_cast<int>(analysis.blocks.size() - 1);
72+
73+
// Start new block.
74+
block = &beginblock_instr.arg.block;
75+
block_stack_change = 0;
7776

7877
if (jumpdest) // Add the jumpdest to the map.
7978
{

lib/evmone/analysis.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ static_assert(sizeof(block_info) == 8);
189189
struct code_analysis
190190
{
191191
std::vector<instr_info> instrs;
192-
std::vector<block_info> blocks;
193192

194193
/// Storage for large push values.
195194
std::vector<intx::uint256> push_values;

lib/evmone/instructions.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,7 @@ const instr_info* op_selfdestruct(const instr_info*, execution_state& state) noe
12001200

12011201
const instr_info* opx_beginblock(const instr_info* instr, execution_state& state) noexcept
12021202
{
1203-
auto& block = state.analysis->blocks[static_cast<size_t>(instr->arg.p.number)];
1203+
auto& block = instr->arg.block;
12041204

12051205
if ((state.gas_left -= block.gas_cost) < 0)
12061206
return state.exit(EVMC_OUT_OF_GAS);

test/unittests/analysis_test.cpp

+6-14
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ TEST(analysis, example1)
3030
ASSERT_EQ(analysis.instrs.size(), 8);
3131

3232
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OPX_BEGINBLOCK]);
33-
EXPECT_EQ(analysis.instrs[0].arg.p.number, 0);
3433
EXPECT_EQ(analysis.instrs[1].fn, fake_fn_table[OP_PUSH1]);
3534
EXPECT_EQ(analysis.instrs[2].fn, fake_fn_table[OP_PUSH1]);
3635
EXPECT_EQ(analysis.instrs[3].fn, fake_fn_table[OP_MSTORE8]);
@@ -39,10 +38,9 @@ TEST(analysis, example1)
3938
EXPECT_EQ(analysis.instrs[6].fn, fake_fn_table[OP_SSTORE]);
4039
EXPECT_EQ(analysis.instrs[7].fn, fake_fn_table[OP_STOP]);
4140

42-
ASSERT_EQ(analysis.blocks.size(), 1);
43-
EXPECT_EQ(analysis.blocks[0].gas_cost, 14);
44-
EXPECT_EQ(analysis.blocks[0].stack_req, 0);
45-
EXPECT_EQ(analysis.blocks[0].stack_max_growth, 2);
41+
EXPECT_EQ(analysis.instrs[0].arg.block.gas_cost, 14);
42+
EXPECT_EQ(analysis.instrs[0].arg.block.stack_req, 0);
43+
EXPECT_EQ(analysis.instrs[0].arg.block.stack_max_growth, 2);
4644
}
4745

4846
TEST(analysis, stack_up_and_down)
@@ -52,16 +50,14 @@ TEST(analysis, stack_up_and_down)
5250

5351
ASSERT_EQ(analysis.instrs.size(), 20);
5452
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OPX_BEGINBLOCK]);
55-
EXPECT_EQ(analysis.instrs[0].arg.p.number, 0);
5653
EXPECT_EQ(analysis.instrs[1].fn, fake_fn_table[OP_DUP2]);
5754
EXPECT_EQ(analysis.instrs[2].fn, fake_fn_table[OP_DUP1]);
5855
EXPECT_EQ(analysis.instrs[8].fn, fake_fn_table[OP_POP]);
5956
EXPECT_EQ(analysis.instrs[18].fn, fake_fn_table[OP_PUSH1]);
6057

61-
ASSERT_EQ(analysis.blocks.size(), 1);
62-
EXPECT_EQ(analysis.blocks[0].gas_cost, 7 * 3 + 10 * 2 + 3);
63-
EXPECT_EQ(analysis.blocks[0].stack_req, 3);
64-
EXPECT_EQ(analysis.blocks[0].stack_max_growth, 7);
58+
EXPECT_EQ(analysis.instrs[0].arg.block.gas_cost, 7 * 3 + 10 * 2 + 3);
59+
EXPECT_EQ(analysis.instrs[0].arg.block.stack_req, 3);
60+
EXPECT_EQ(analysis.instrs[0].arg.block.stack_max_growth, 7);
6561
}
6662

6763
TEST(analysis, push)
@@ -82,7 +78,6 @@ TEST(analysis, jump1)
8278
const auto code = jump(add(4, 2)) + OP_JUMPDEST + mstore(0, 3) + ret(0, 0x20) + jump(6);
8379
const auto analysis = analyze(fake_fn_table, rev, &code[0], code.size());
8480

85-
ASSERT_EQ(analysis.blocks.size(), 3);
8681
ASSERT_EQ(analysis.jumpdest_offsets.size(), 1);
8782
ASSERT_EQ(analysis.jumpdest_targets.size(), 1);
8883
EXPECT_EQ(analysis.jumpdest_offsets[0], 6);
@@ -97,7 +92,6 @@ TEST(analysis, empty)
9792
bytes code;
9893
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
9994

100-
EXPECT_EQ(analysis.blocks.size(), 0);
10195
EXPECT_EQ(analysis.instrs.size(), 1);
10296
EXPECT_EQ(analysis.instrs.back().fn, fake_fn_table[OP_STOP]);
10397
}
@@ -107,7 +101,6 @@ TEST(analysis, only_jumpdest)
107101
auto code = from_hex("5b");
108102
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
109103

110-
ASSERT_EQ(analysis.blocks.size(), 1);
111104
ASSERT_EQ(analysis.jumpdest_offsets.size(), 1);
112105
ASSERT_EQ(analysis.jumpdest_targets.size(), 1);
113106
EXPECT_EQ(analysis.jumpdest_offsets[0], 0);
@@ -119,6 +112,5 @@ TEST(analysis, jumpi_at_the_end)
119112
auto code = from_hex("57");
120113
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
121114

122-
EXPECT_EQ(analysis.blocks.size(), 1);
123115
EXPECT_EQ(analysis.instrs.back().fn, fake_fn_table[OP_STOP]);
124116
}

test/utils/dump.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void dump_analysis(const evmone::code_analysis& analysis)
2828

2929
if (c == OPX_BEGINBLOCK)
3030
{
31-
block = &analysis.blocks[size_t(instr.arg.p.number)];
31+
block = &instr.arg.block;
3232

3333
const auto get_jumpdest_offset = [&analysis](size_t index) noexcept
3434
{

0 commit comments

Comments
 (0)