Skip to content

Commit 7897280

Browse files
committed
Keep block info in instruction argument
1 parent 0329757 commit 7897280

File tree

5 files changed

+14
-26
lines changed

5 files changed

+14
-26
lines changed

lib/evmone/analysis.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,8 @@ code_analysis analyze(
179179
static_cast<int16_t>(block.stack_req) :
180180
std::numeric_limits<int16_t>::max();
181181
const auto stack_max_growth = static_cast<int16_t>(block.stack_max_growth);
182-
analysis.blocks.emplace_back(block_info{block.gas_cost, stack_req, stack_max_growth});
183-
analysis.instrs[block.first_instruction_index].arg.p.number =
184-
static_cast<int>(analysis.blocks.size() - 1);
182+
analysis.instrs[block.first_instruction_index].arg.block = {
183+
block.gas_cost, stack_req, stack_max_growth};
185184

186185
// Create new block.
187186
analysis.instrs.emplace_back(fns[OPX_BEGINBLOCK]);
@@ -194,9 +193,8 @@ code_analysis analyze(
194193
static_cast<int16_t>(block.stack_req) :
195194
std::numeric_limits<int16_t>::max();
196195
const auto stack_max_growth = static_cast<int16_t>(block.stack_max_growth);
197-
analysis.blocks.emplace_back(block_info{block.gas_cost, stack_req, stack_max_growth});
198-
analysis.instrs[block.first_instruction_index].arg.p.number =
199-
static_cast<int>(analysis.blocks.size() - 1);
196+
analysis.instrs[block.first_instruction_index].arg.block = {
197+
block.gas_cost, stack_req, stack_max_growth};
200198

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

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

+8-17
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)
@@ -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

+1-1
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.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)