diff options
author | Ben Bridle <bridle.benjamin@gmail.com> | 2024-01-29 18:33:58 +1300 |
---|---|---|
committer | Ben Bridle <bridle.benjamin@gmail.com> | 2024-01-31 07:37:54 +1300 |
commit | 30d2f099c9edf4f59fbbdd6686988ae7b0622ba2 (patch) | |
tree | 9c5661c8b623b398b15f0e6c6899f1f9d8bcbc44 /src/devices | |
parent | e4cdcf4f5082f90abd9e259ccc215ecbb1973ab5 (diff) | |
download | bedrock-pc-30d2f099c9edf4f59fbbdd6686988ae7b0622ba2.zip |
Prevent overflow errors on stream device pointers
The stream device pointers now use wrapping semantics in order to
prevent overflow errors.
Diffstat (limited to 'src/devices')
-rw-r--r-- | src/devices/scratch.rs | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/devices/scratch.rs b/src/devices/scratch.rs index eea011b..950f87a 100644 --- a/src/devices/scratch.rs +++ b/src/devices/scratch.rs @@ -1,3 +1,10 @@ +macro_rules! then_inc { + ($v:expr) => {{ + $v = $v.wrapping_add(1); + $v as usize + }}; +} + pub struct ScratchDevice { memory: Vec<u8>, pub max_capacity: u32, @@ -17,38 +24,34 @@ impl ScratchDevice { } pub fn read_head_1(&mut self) -> u8 { - let value = self.read_byte(self.pointer_1); - self.pointer_1 += 1; - return value; + let i = then_inc!(self.pointer_1); + self.read_byte(i) } pub fn read_head_2(&mut self) -> u8 { - let value = self.read_byte(self.pointer_2); - self.pointer_2 += 1; - return value; + let i = then_inc!(self.pointer_2); + self.read_byte(i) } pub fn write_head_1(&mut self, value: u8) { - self.write_byte(self.pointer_1, value); - self.pointer_1 += 1; + let i = then_inc!(self.pointer_1); + self.write_byte(i, value); } pub fn write_head_2(&mut self, value: u8) { - self.write_byte(self.pointer_2, value); - self.pointer_2 += 1; + let i = then_inc!(self.pointer_2); + self.write_byte(i, value); } - fn read_byte(&self, pointer: u32) -> u8 { - let pointer = pointer as usize; - match self.memory.get(pointer) { + fn read_byte(&self, pointer: usize) -> u8 { + match self.memory.get(pointer as usize) { Some(value) => *value, None => 0, } } - fn write_byte(&mut self, pointer: u32, value: u8) { - if pointer < self.max_capacity { - let pointer = pointer as usize; + fn write_byte(&mut self, pointer: usize, value: u8) { + if pointer < self.max_capacity as usize { if pointer >= self.memory.len() { self.memory.resize(pointer + 1, 0); } |