diff options
author | Vincent Ambo <mail@tazj.in> | 2021-10-21T09·00+0200 |
---|---|---|
committer | tazjin <mail@tazj.in> | 2021-10-22T09·42+0000 |
commit | 670662a360447509940dac417195cf419d7f42c5 (patch) | |
tree | d602009e12bac63309f60e2a4e271317bb6b17b4 /users/tazjin/rlox/src/bytecode/vm.rs | |
parent | d57e43e1615ae28cfdc74c1c65cbe7863d782018 (diff) |
feat(tazjin/rlox): Implement simple conditionals r/2986
... basically just optional blocks (no else). Change-Id: If091c6b8fdeb6c13a5f3dd284d0a9a87f9f4228d Reviewed-on: https://cl.tvl.fyi/c/depot/+/3739 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
Diffstat (limited to 'users/tazjin/rlox/src/bytecode/vm.rs')
-rw-r--r-- | users/tazjin/rlox/src/bytecode/vm.rs | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/users/tazjin/rlox/src/bytecode/vm.rs b/users/tazjin/rlox/src/bytecode/vm.rs index bbdf70d8dc2f..e0db97abe5a2 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; + } } } |