diff options
author | Tom Stellard <tstellar@gmail.com> | 2011-01-01 19:25:46 -0800 |
---|---|---|
committer | Tom Stellard <tstellar@gmail.com> | 2011-01-01 19:25:46 -0800 |
commit | 08ff894d321967341cf56614fe259e85b7cd2ce4 (patch) | |
tree | 74cdcced332c7aa6b19edee14d4e2b3f8d5b6fc5 | |
parent | ad5d6ca73191d5d83513e123ede7ccf14f1906fc (diff) |
emulator: Add a safer version of set_value()
-rw-r--r-- | emulator.cpp | 23 | ||||
-rw-r--r-- | emulator.h | 4 |
2 files changed, 21 insertions, 6 deletions
diff --git a/emulator.cpp b/emulator.cpp index f9bf38f..a40cb0b 100644 --- a/emulator.cpp +++ b/emulator.cpp @@ -113,17 +113,14 @@ emulator::set_value( switch(addr.m_type) { case REGISTER_TYPE_TEMP: - delete m_temp_regs[index]; - m_temp_regs[index] = val; + set_value(m_temp_regs, index, val); break; case REGISTER_TYPE_OUT: - delete m_out_regs[index]; - m_out_regs[index] = val; + set_value(m_out_regs, index, val); break; case REGISTER_TYPE_PRIVATE: /*In theory, these registers should only be written once. */ - delete m_private_regs[index]; - m_private_regs[index] = val; + set_value(m_private_regs, index, val); break; case REGISTER_TYPE_NONE: /* Do nothing. */ @@ -133,6 +130,20 @@ emulator::set_value( } } +void +emulator::set_value( + std::vector<value *> & vector, + unsigned int index, + value * val) +{ + if (index >= vector.size()) { + std::cerr << __FUNCTION__ << ": Index out of bounds\n"; + return; + } + delete vector[index]; + vector[index] = val; +} + value * emulator::get_output_value(unsigned int index) { @@ -38,6 +38,10 @@ private: void set_value( register_address addr, value * val); + void set_value( + std::vector<value *> & vector, + unsigned int index, + value * val); program_loader * m_loader; std::vector<value *> m_temp_regs; |