use crate::chunk::Op;
use crate::value::VmError;
impl super::super::Vm {
pub(super) fn try_execute_control_flow_op(&mut self, op: u8) -> Result<bool, VmError> {
if op == Op::Jump as u8 {
let frame = self.frames.last_mut().unwrap();
let target = frame.chunk.read_u16(frame.ip) as usize;
frame.ip = target;
} else if op == Op::JumpIfFalse as u8 {
let frame = self.frames.last_mut().unwrap();
let target = frame.chunk.read_u16(frame.ip) as usize;
frame.ip += 2;
let val = self.peek()?;
if !val.is_truthy() {
let frame = self.frames.last_mut().unwrap();
frame.ip = target;
}
} else if op == Op::JumpIfTrue as u8 {
let frame = self.frames.last_mut().unwrap();
let target = frame.chunk.read_u16(frame.ip) as usize;
frame.ip += 2;
let val = self.peek()?;
if val.is_truthy() {
let frame = self.frames.last_mut().unwrap();
frame.ip = target;
}
} else {
return Ok(false);
}
Ok(true)
}
}