diff --git a/rlox/src/bc.rs b/rlox/src/bc.rs index f95916a..d51385b 100644 --- a/rlox/src/bc.rs +++ b/rlox/src/bc.rs @@ -6,6 +6,7 @@ use std::fmt; pub enum Op { Return, Constant { offset: usize }, + Nil, Negate, Add, Subtract, @@ -133,7 +134,7 @@ impl fmt::Debug for TraceInfo<'_> { }?; match op { - Op::Return | Op::Negate | Op::Add | Op::Subtract | Op::Multiply | Op::Divide => { + Op::Return | Op::Nil | Op::Negate | Op::Add | Op::Subtract | Op::Multiply | Op::Divide => { write!(f, "{:?}", op) } Op::Constant { offset } => { diff --git a/rlox/src/lc.rs b/rlox/src/lc.rs index 70dda3c..cce6ad7 100644 --- a/rlox/src/lc.rs +++ b/rlox/src/lc.rs @@ -352,7 +352,7 @@ impl<'src> Parser<'src> { ttype: TokenType::Nil, span: _, } => { - chunk.add_constant(Value::Nil, 0); + chunk.add_op(Op::Nil, 0); } Token { ttype: TokenType::LeftParen, @@ -497,9 +497,9 @@ mod tests { use crate::bc::Op::*; let expected = Chunk::new_with( - vec![Constant { offset: 0 }, Constant { offset: 1 }, Add], + vec![Nil, Nil, Add], + vec![], vec![], - vec![Value::Nil, Value::Nil], ); assert!(chunk.instr_eq(&expected)); diff --git a/rlox/src/vm.rs b/rlox/src/vm.rs index ce72316..a8d6082 100644 --- a/rlox/src/vm.rs +++ b/rlox/src/vm.rs @@ -76,6 +76,7 @@ impl VM { match instr { Op::Return => print!("{:?}", self.pop()?), Op::Constant { offset } => self.push(chunk.constants[offset]), + Op::Nil => self.push(Value::Nil), Op::Negate => { let new_val = -self.pop_num()?; self.push(new_val.into()); @@ -144,9 +145,9 @@ mod tests { #[test] fn runtime_type_error() { let chunk = Chunk::new_with( - vec![Op::Constant { offset: 0 }, Op::Negate], + vec![Op::Nil, Op::Negate], + vec![], vec![], - vec![Value::Nil], ); let mut vm = VM::new();