@@ -17,40 +17,40 @@ using namespace evmone::instr;
17
17
template <Opcode Op, void CoreFn (StackTop) noexcept = core::impl<Op>>
18
18
inline void impl(AdvancedExecutionState& state) noexcept
19
19
{
20
- CoreFn (state.stack . top_item );
21
- state.stack . top_item += instr::traits[Op].stack_height_change ;
20
+ CoreFn (state.stack );
21
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
22
22
}
23
23
24
24
template <Opcode Op, void CoreFn (StackTop, ExecutionState&) noexcept = core::impl<Op>>
25
25
inline void impl(AdvancedExecutionState& state) noexcept
26
26
{
27
- CoreFn (state.stack . top_item , state);
28
- state.stack . top_item += instr::traits[Op].stack_height_change ;
27
+ CoreFn (state.stack , state);
28
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
29
29
}
30
30
31
31
template <Opcode Op, evmc_status_code CoreFn (StackTop, ExecutionState&) noexcept = core::impl<Op>>
32
32
inline evmc_status_code impl(AdvancedExecutionState& state) noexcept
33
33
{
34
- const auto status = CoreFn (state.stack . top_item , state);
35
- state.stack . top_item += instr::traits[Op].stack_height_change ;
34
+ const auto status = CoreFn (state.stack , state);
35
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
36
36
return status;
37
37
}
38
38
39
39
template <Opcode Op,
40
40
evmc_status_code CoreFn (StackTop, int64_t &, ExecutionState&) noexcept = core::impl<Op>>
41
41
inline evmc_status_code impl(AdvancedExecutionState& state) noexcept
42
42
{
43
- const auto status = CoreFn (state.stack . top_item , state.gas_left , state);
44
- state.stack . top_item += instr::traits[Op].stack_height_change ;
43
+ const auto status = CoreFn (state.stack , state.gas_left , state);
44
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
45
45
return status;
46
46
}
47
47
48
48
template <Opcode Op, Result CoreFn (StackTop, int64_t , ExecutionState&) noexcept = core::impl<Op>>
49
49
inline evmc_status_code impl(AdvancedExecutionState& state) noexcept
50
50
{
51
- const auto status = CoreFn (state.stack . top_item , state.gas_left , state);
51
+ const auto status = CoreFn (state.stack , state.gas_left , state);
52
52
state.gas_left = status.gas_left ;
53
- state.stack . top_item += instr::traits[Op].stack_height_change ;
53
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
54
54
return status.status ;
55
55
}
56
56
@@ -59,39 +59,39 @@ template <Opcode Op,
59
59
inline TermResult impl(AdvancedExecutionState& state) noexcept
60
60
{
61
61
// Stack height adjustment may be omitted.
62
- return CoreFn (state.stack . top_item , state.gas_left , state);
62
+ return CoreFn (state.stack , state.gas_left , state);
63
63
}
64
64
65
65
template <Opcode Op,
66
66
Result CoreFn (StackTop, int64_t , ExecutionState&, code_iterator&) noexcept = core::impl<Op>>
67
67
inline Result impl(AdvancedExecutionState& state, code_iterator pos) noexcept
68
68
{
69
69
// Stack height adjustment may be omitted.
70
- return CoreFn (state.stack . top_item , state.gas_left , state, pos);
70
+ return CoreFn (state.stack , state.gas_left , state, pos);
71
71
}
72
72
73
73
template <Opcode Op,
74
74
TermResult CoreFn (StackTop, int64_t , ExecutionState&, code_iterator) noexcept = core::impl<Op>>
75
75
inline TermResult impl(AdvancedExecutionState& state, code_iterator pos) noexcept
76
76
{
77
77
// Stack height adjustment may be omitted.
78
- return CoreFn (state.stack . top_item , state.gas_left , state, pos);
78
+ return CoreFn (state.stack , state.gas_left , state, pos);
79
79
}
80
80
81
81
template <Opcode Op,
82
82
code_iterator CoreFn (StackTop, ExecutionState&, code_iterator) noexcept = core::impl<Op>>
83
83
inline code_iterator impl(AdvancedExecutionState& state, code_iterator pos) noexcept
84
84
{
85
- const auto new_pos = CoreFn (state.stack . top_item , state, pos);
86
- state.stack . top_item += instr::traits[Op].stack_height_change ;
85
+ const auto new_pos = CoreFn (state.stack , state, pos);
86
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
87
87
return new_pos;
88
88
}
89
89
90
90
template <Opcode Op, code_iterator CoreFn (StackTop, code_iterator) noexcept = core::impl<Op>>
91
91
inline code_iterator impl(AdvancedExecutionState& state, code_iterator pos) noexcept
92
92
{
93
- const auto new_pos = CoreFn (state.stack . top_item , pos);
94
- state.stack . top_item += instr::traits[Op].stack_height_change ;
93
+ const auto new_pos = CoreFn (state.stack , pos);
94
+ state.adjust_stack_size ( instr::traits[Op].stack_height_change ) ;
95
95
return new_pos;
96
96
}
97
97
// / @}
@@ -163,10 +163,9 @@ const Instruction* opx_beginblock(const Instruction* instr, AdvancedExecutionSta
163
163
if ((state.gas_left -= block.gas_cost ) < 0 )
164
164
return state.exit (EVMC_OUT_OF_GAS);
165
165
166
- if (static_cast < int >( state.stack . size ()) < block.stack_req )
166
+ if (const auto stack_size = state.stack_size (); stack_size < block.stack_req )
167
167
return state.exit (EVMC_STACK_UNDERFLOW);
168
-
169
- if (static_cast <int >(state.stack .size ()) + block.stack_max_growth > StackSpace::limit)
168
+ else if (stack_size + block.stack_max_growth > StackSpace::limit)
170
169
return state.exit (EVMC_STACK_OVERFLOW);
171
170
172
171
state.current_block_cost = block.gas_cost ;
@@ -189,12 +188,12 @@ const Instruction* op_jumpi(const Instruction* instr, AdvancedExecutionState& st
189
188
if (state.stack [1 ] != 0 )
190
189
{
191
190
instr = op_jump (instr, state); // target
192
- state.stack .pop (); // condition
191
+ ( void ) state.stack .pop (); // condition
193
192
}
194
193
else
195
194
{
196
- state.stack .pop (); // target
197
- state.stack .pop (); // condition
195
+ ( void ) state.stack .pop (); // target
196
+ ( void ) state.stack .pop (); // condition
198
197
instr = opx_beginblock (instr, state); // follow-by block
199
198
}
200
199
return instr;
0 commit comments