From 17face3633686e374aa0859271ccf462a48e60aa Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sun, 4 Feb 2024 16:46:20 -0800 Subject: Rewrite the bytecode interpreter in Rust. --- bytecode/src/value.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 bytecode/src/value.rs (limited to 'bytecode/src/value.rs') diff --git a/bytecode/src/value.rs b/bytecode/src/value.rs new file mode 100644 index 0000000..fbaa128 --- /dev/null +++ b/bytecode/src/value.rs @@ -0,0 +1,31 @@ +#[derive(Clone, Copy)] +pub struct Value(pub u64); + +impl Value { + pub fn repr(self) -> u64 { + let Value(v) = self; + v + } + + pub fn to_int(self) -> Option { + if self.repr() & 1 == 0 { + return None; + } + Some(self.repr() as i64 >> 1) + } + + pub fn from_int(i: i64) -> Value { + Value((i as u64) << 1 | 1) + } + + pub fn to_pointer(self) -> Option { + if self.repr() == 0 || self.repr() & 7 != 0 { + return None; + } + Some(usize::try_from(self.repr() >> 3).expect("using 32 bits in 2024 LULW")) + } + + pub fn from_pointer(p: usize) -> Value { + Value(u64::try_from(p).expect("a usize should always fit in a u64... right?") << 3) + } +} -- cgit v1.3.1