Skip to content

Commit 5543aae

Browse files
committed
Cram m_initcode_validity into m_initcodes
1 parent 0480644 commit 5543aae

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

lib/evmone/execution_state.hpp

+18-8
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ class Memory
145145
void clear() noexcept { m_size = 0; }
146146
};
147147

148+
struct TransactionInitcode
149+
{
150+
bytes_view code;
151+
std::optional<bool> is_valid;
152+
};
148153

149154
/// Generic execution state for generic instructions implementations.
150155
// NOLINTNEXTLINE(clang-analyzer-optin.performance.Padding)
@@ -172,8 +177,7 @@ class ExecutionState
172177

173178
private:
174179
evmc_tx_context m_tx = {};
175-
std::optional<std::unordered_map<evmc::bytes32, bytes_view>> m_initcodes;
176-
std::unordered_map<evmc::bytes32, bool> m_initcodes_validity;
180+
std::optional<std::unordered_map<evmc::bytes32, TransactionInitcode>> m_initcodes;
177181

178182
public:
179183
/// Pointer to code analysis.
@@ -217,7 +221,6 @@ class ExecutionState
217221
deploy_container = {};
218222
m_tx = {};
219223
m_initcodes.reset();
220-
m_initcodes_validity.clear();
221224
call_stack = {};
222225
}
223226

@@ -242,27 +245,34 @@ class ExecutionState
242245
for (size_t i = 0; i < tx_context.initcodes_count; ++i)
243246
{
244247
const auto& initcode = tx_context.initcodes[i];
245-
m_initcodes->insert({initcode.hash, {initcode.code, initcode.code_size}});
248+
m_initcodes->insert({initcode.hash,
249+
{.code = {initcode.code, initcode.code_size}, .is_valid = std::nullopt}});
246250
}
247251
}
248252

249253
const auto it = m_initcodes->find(hash);
250-
return it != m_initcodes->end() ? it->second : bytes_view{};
254+
return it != m_initcodes->end() ? it->second.code : bytes_view{};
251255
}
252256

253257
/// Get validity of initcode from transaction initcodes by its hash.
254258
///
255259
/// Returns std::nullopt if no such initcode was validated yet.
256260
[[nodiscard]] std::optional<bool> get_initcode_validity(const evmc_bytes32& hash) noexcept
257261
{
258-
const auto it = m_initcodes_validity.find(hash);
259-
return (it != m_initcodes_validity.end() ? std::optional{it->second} : std::nullopt);
262+
if (!m_initcodes.has_value())
263+
return std::nullopt;
264+
265+
const auto it = m_initcodes->find(hash);
266+
return (it != m_initcodes->end() ? it->second.is_valid : std::nullopt);
260267
}
261268

262269
/// Set validity of initcode from transaction initcodes.
263270
void set_initcode_validity(const evmc_bytes32& hash, bool is_valid)
264271
{
265-
m_initcodes_validity[hash] = is_valid;
272+
if (!m_initcodes.has_value())
273+
return;
274+
275+
(*m_initcodes)[hash].is_valid = is_valid;
266276
}
267277
};
268278
} // namespace evmone

0 commit comments

Comments
 (0)