From 056fbf7e7dc727d020ba54e439f2b47411c58e76 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Thu, 3 Mar 2022 13:48:19 -0800 Subject: Start the garbage collector. I don't think we finished it, but I wrote this code a while ago and I'm just trying to get it committed. --- bytecode/src/stack.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 bytecode/src/stack.rs (limited to 'bytecode/src/stack.rs') diff --git a/bytecode/src/stack.rs b/bytecode/src/stack.rs new file mode 100644 index 0000000..66d3f7c --- /dev/null +++ b/bytecode/src/stack.rs @@ -0,0 +1,33 @@ +struct Stack { + v: Vec, +} + +impl Stack { + fn pop(&mut self) -> Result { + self.v.pop().ok_or(String::from("stack underflow")) + } + + fn pop_int(&mut self) -> Result { + Ok(self.pop()? as i64 >> 1) + } + + fn push_int(&mut self, i: i64) { + self.v.push((i as u64) << 1 | 1); + } + + fn pop_pointer(&mut self) -> Result { + Ok(Pointer::from_bytes(self.pop()?)) + } + + fn push_pointer(&mut self, p: Pointer) { + self.v.push(p.bytes()); + } + + fn pop_usize(&mut self) -> Result { + Ok(usize::try_from(self.pop()?).unwrap() >> 1) + } + + fn push_usize(&mut self, p: usize) { + self.v.push(u64::try_from(p).unwrap() << 1 | 1); + } +} -- cgit v1.3.1