From 670662a360447509940dac417195cf419d7f42c5 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 21 Oct 2021 11:00:33 +0200 Subject: feat(tazjin/rlox): Implement simple conditionals ... basically just optional blocks (no else). Change-Id: If091c6b8fdeb6c13a5f3dd284d0a9a87f9f4228d Reviewed-on: https://cl.tvl.fyi/c/depot/+/3739 Tested-by: BuildkiteCI Reviewed-by: tazjin --- users/tazjin/rlox/src/bytecode/vm.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'users/tazjin/rlox/src/bytecode/vm.rs') diff --git a/users/tazjin/rlox/src/bytecode/vm.rs b/users/tazjin/rlox/src/bytecode/vm.rs index bbdf70d8dc..e0db97abe5 100644 --- a/users/tazjin/rlox/src/bytecode/vm.rs +++ b/users/tazjin/rlox/src/bytecode/vm.rs @@ -201,8 +201,27 @@ impl VM { } OpCode::OpSetLocal(local_idx) => { - debug_assert!(self.stack.len() > local_idx.0, "stack is not currently large enough for local"); - self.stack[local_idx.0] = self.stack.last().unwrap().clone(); + debug_assert!( + self.stack.len() > local_idx.0, + "stack is not currently large enough for local" + ); + self.stack[local_idx.0] = + self.stack.last().unwrap().clone(); + } + + OpCode::OpJumpPlaceholder(_) => { + panic!("unpatched jump detected - this is a fatal compiler error!"); + } + + OpCode::OpJumpIfFalse(offset) => { + if self + .stack + .last() + .expect("condition should leave a value on the stack") + .is_falsey() + { + self.ip += offset.0; + } } } -- cgit 1.4.1