diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/bytecode_manager.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/bytecode_manager.hpp index 6b5a1406d816..a3fc4add9755 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/bytecode_manager.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/bytecode_manager.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -74,25 +75,33 @@ class BytecodeManagerInterface { public: virtual ~BytecodeManagerInterface() = default; - virtual Instruction read_instruction(uint32_t pc) const = 0; - virtual BytecodeId get_bytecode_id() const = 0; + virtual Instruction read_instruction(uint32_t pc) = 0; + // Returns the id of the current bytecode. Tries to fetch it if not already done. + virtual BytecodeId get_bytecode_id() = 0; }; class BytecodeManager : public BytecodeManagerInterface { public: - BytecodeManager(BytecodeId bytecode_id, TxBytecodeManagerInterface& tx_bytecode_manager) - : bytecode_id(bytecode_id) + BytecodeManager(AztecAddress address, TxBytecodeManagerInterface& tx_bytecode_manager) + : address(address) , tx_bytecode_manager(tx_bytecode_manager) {} - Instruction read_instruction(uint32_t pc) const override + Instruction read_instruction(uint32_t pc) override { - return tx_bytecode_manager.read_instruction(bytecode_id, pc); + return tx_bytecode_manager.read_instruction(get_bytecode_id(), pc); + } + BytecodeId get_bytecode_id() override + { + if (!bytecode_id.has_value()) { + bytecode_id = tx_bytecode_manager.get_bytecode(address); + } + return bytecode_id.value(); } - BytecodeId get_bytecode_id() const override { return bytecode_id; } private: - BytecodeId bytecode_id; + AztecAddress address; + std::optional bytecode_id; TxBytecodeManagerInterface& tx_bytecode_manager; }; diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/context.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/context.hpp index f6c835a0f6f7..a30eb378b284 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/context.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/context.hpp @@ -105,14 +105,11 @@ class ContextProvider : public ContextProviderInterface { { uint32_t space_id = static_cast(address); // FIXME: space id. - // FIXME: doing too much in a "constructor"! - BytecodeId bytecode_id = tx_bytecode_manager.get_bytecode(address); - return std::make_unique(address, msg_sender, calldata, is_static, - std::make_unique(bytecode_id, tx_bytecode_manager), + std::make_unique(address, tx_bytecode_manager), std::make_unique(space_id, memory_events)); } @@ -121,4 +118,4 @@ class ContextProvider : public ContextProviderInterface { EventEmitterInterface& memory_events; }; -} // namespace bb::avm2::simulation \ No newline at end of file +} // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_bytecode_manager.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_bytecode_manager.hpp index 645a682d8be7..f76aa236c719 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_bytecode_manager.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_bytecode_manager.hpp @@ -16,8 +16,8 @@ class MockBytecodeManager : public BytecodeManagerInterface { MockBytecodeManager(); ~MockBytecodeManager() override; - MOCK_METHOD(Instruction, read_instruction, (uint32_t pc), (const, override)); - MOCK_METHOD(BytecodeId, get_bytecode_id, (), (const, override)); + MOCK_METHOD(Instruction, read_instruction, (uint32_t pc), (override)); + MOCK_METHOD(BytecodeId, get_bytecode_id, (), (override)); }; -} // namespace bb::avm2::simulation \ No newline at end of file +} // namespace bb::avm2::simulation