summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <tstellar@gmail.com>2011-01-01 19:25:46 -0800
committerTom Stellard <tstellar@gmail.com>2011-01-01 19:25:46 -0800
commit08ff894d321967341cf56614fe259e85b7cd2ce4 (patch)
tree74cdcced332c7aa6b19edee14d4e2b3f8d5b6fc5
parentad5d6ca73191d5d83513e123ede7ccf14f1906fc (diff)
emulator: Add a safer version of set_value()
-rw-r--r--emulator.cpp23
-rw-r--r--emulator.h4
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)
{
diff --git a/emulator.h b/emulator.h
index c9ad2e3..6a99eff 100644
--- a/emulator.h
+++ b/emulator.h
@@ -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;