Skip to content

Commit 1344f35

Browse files
committed
Keep block info in instruction argument
1 parent 5489ffe commit 1344f35

File tree

5 files changed

+14
-26
lines changed

5 files changed

+14
-26
lines changed

lib/evmone/analysis.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,8 @@ code_analysis analyze(
153153
static_cast<int16_t>(block.stack_req) :
154154
std::numeric_limits<int16_t>::max();
155155
const auto stack_max_growth = static_cast<int16_t>(block.stack_max_growth);
156-
analysis.blocks.emplace_back(block_info{block.gas_cost, stack_req, stack_max_growth});
157-
analysis.instrs[block.first_instruction_index].arg.number =
158-
static_cast<int>(analysis.blocks.size() - 1);
156+
analysis.instrs[block.first_instruction_index].arg.block = {
157+
block.gas_cost, stack_req, stack_max_growth};
159158

160159
// Create new block.
161160
analysis.instrs.emplace_back(fns[OPX_BEGINBLOCK]);
@@ -168,9 +167,8 @@ code_analysis analyze(
168167
static_cast<int16_t>(block.stack_req) :
169168
std::numeric_limits<int16_t>::max();
170169
const auto stack_max_growth = static_cast<int16_t>(block.stack_max_growth);
171-
analysis.blocks.emplace_back(block_info{block.gas_cost, stack_req, stack_max_growth});
172-
analysis.instrs[block.first_instruction_index].arg.number =
173-
static_cast<int>(analysis.blocks.size() - 1);
170+
analysis.instrs[block.first_instruction_index].arg.block = {
171+
block.gas_cost, stack_req, stack_max_growth};
174172

175173
// Make sure the last block is terminated.
176174
// TODO: This is not needed if the last instruction is a terminating one.

lib/evmone/analysis.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ static_assert(sizeof(block_info) == 8);
185185
struct code_analysis
186186
{
187187
std::vector<instr_info> instrs;
188-
std::vector<block_info> blocks;
189188

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

lib/evmone/instructions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1204,7 +1204,7 @@ const instr_info* op_selfdestruct(const instr_info*, execution_state& state) noe
12041204

12051205
const instr_info* opx_beginblock(const instr_info* instr, execution_state& state) noexcept
12061206
{
1207-
auto& block = state.analysis->blocks[static_cast<size_t>(instr->arg.number)];
1207+
auto& block = instr->arg.block;
12081208

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

test/unittests/analysis_test.cpp

Lines changed: 8 additions & 17 deletions
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.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.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)
@@ -86,11 +82,12 @@ TEST(analysis, jumpdest_skip)
8682
const auto code = bytecode{} + OP_STOP + OP_JUMPDEST;
8783
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
8884

89-
EXPECT_EQ(analysis.blocks.size(), 2);
9085
ASSERT_EQ(analysis.instrs.size(), 4);
9186
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OPX_BEGINBLOCK]);
87+
EXPECT_EQ(analysis.instrs[0].arg.block.gas_cost, 0);
9288
EXPECT_EQ(analysis.instrs[1].fn, fake_fn_table[OP_STOP]);
9389
EXPECT_EQ(analysis.instrs[2].fn, fake_fn_table[OP_JUMPDEST]);
90+
EXPECT_EQ(analysis.instrs[2].arg.block.gas_cost, 1);
9491
EXPECT_EQ(analysis.instrs[3].fn, fake_fn_table[OP_STOP]);
9592
}
9693

@@ -99,7 +96,6 @@ TEST(analysis, jump1)
9996
const auto code = jump(add(4, 2)) + OP_JUMPDEST + mstore(0, 3) + ret(0, 0x20) + jump(6);
10097
const auto analysis = analyze(fake_fn_table, rev, &code[0], code.size());
10198

102-
ASSERT_EQ(analysis.blocks.size(), 4);
10399
ASSERT_EQ(analysis.jumpdest_offsets.size(), 1);
104100
ASSERT_EQ(analysis.jumpdest_targets.size(), 1);
105101
EXPECT_EQ(analysis.jumpdest_offsets[0], 6);
@@ -114,7 +110,6 @@ TEST(analysis, empty)
114110
bytes code;
115111
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
116112

117-
EXPECT_EQ(analysis.blocks.size(), 1);
118113
EXPECT_EQ(analysis.instrs.size(), 2);
119114
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OPX_BEGINBLOCK]);
120115
EXPECT_EQ(analysis.instrs[1].fn, fake_fn_table[OP_STOP]);
@@ -125,7 +120,6 @@ TEST(analysis, only_jumpdest)
125120
const auto code = bytecode{OP_JUMPDEST};
126121
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
127122

128-
ASSERT_EQ(analysis.blocks.size(), 1);
129123
ASSERT_EQ(analysis.jumpdest_offsets.size(), 1);
130124
ASSERT_EQ(analysis.jumpdest_targets.size(), 1);
131125
EXPECT_EQ(analysis.jumpdest_offsets[0], 0);
@@ -137,7 +131,6 @@ TEST(analysis, jumpi_at_the_end)
137131
const auto code = bytecode{OP_JUMPI};
138132
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
139133

140-
EXPECT_EQ(analysis.blocks.size(), 2);
141134
ASSERT_EQ(analysis.instrs.size(), 4);
142135
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OPX_BEGINBLOCK]);
143136
EXPECT_EQ(analysis.instrs[1].fn, fake_fn_table[OP_JUMPI]);
@@ -152,7 +145,6 @@ TEST(analysis, terminated_last_block)
152145
const auto code = ret(0, 0);
153146
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
154147

155-
EXPECT_EQ(analysis.blocks.size(), 2);
156148
ASSERT_EQ(analysis.instrs.size(), 6);
157149
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OPX_BEGINBLOCK]);
158150
EXPECT_EQ(analysis.instrs[3].fn, fake_fn_table[OP_RETURN]);
@@ -165,7 +157,6 @@ TEST(analysis, jumpdests_groups)
165157
const auto code = 3 * OP_JUMPDEST + push(1) + 3 * OP_JUMPDEST + push(2) + OP_JUMPI;
166158
auto analysis = evmone::analyze(fake_fn_table, rev, &code[0], code.size());
167159

168-
EXPECT_EQ(analysis.blocks.size(), 7);
169160
ASSERT_EQ(analysis.instrs.size(), 11);
170161
EXPECT_EQ(analysis.instrs[0].fn, fake_fn_table[OP_JUMPDEST]);
171162
EXPECT_EQ(analysis.instrs[1].fn, fake_fn_table[OP_JUMPDEST]);

test/utils/dump.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void dump(const evmone::code_analysis& analysis)
2828

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

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

0 commit comments

Comments
 (0)