use crate::virtualmachine::program::VirtualProgram;
use crate::virtualmachine::variable::VariableData;
#[derive(Debug, Clone)]
pub enum Operand {
Derefed(usize, isize), Register(usize), Value(VariableData),
}
pub(crate) fn get_operand_value<'a>(
program: &'a VirtualProgram,
operand: &'a Operand,
) -> &'a VariableData {
match operand {
Operand::Derefed(register, offset) => {
&program.stack[(program.registers[*register].to_u64() as isize + *offset) as usize]
}
Operand::Register(register) => &program.registers[*register],
Operand::Value(val) => val,
}
}
pub(crate) fn get_operand_value_mut<'a>(
program: &'a mut VirtualProgram,
operand: &'a Operand,
) -> &'a mut VariableData {
match operand {
Operand::Derefed(register, offset) => {
&mut program.stack[(program.registers[*register].to_u64() as isize + *offset) as usize]
}
Operand::Register(register) => &mut program.registers[*register],
Operand::Value(_) => {
panic!("get_operand_value_mut: cannot get mutable reference from value")
}
}
}