use crate::vm::value::Value; #[derive(Debug)] pub enum Operand { Value(Value), FieldPointer(*const Value), FieldPointerMut(*mut Value), Null, } impl Operand { pub fn unwrap_value(&self) -> &Value { match self { Operand::Value(value) => value, _ => panic!("Attempt to unwrap {:?} as Value", self), } } pub fn unwrap_field_pointer(&self) -> *const Value { match self { Operand::FieldPointer(p) => *p, _ => panic!("Attempt to unwrap {:?} as FieldPointer", self), } } pub fn unwrap_field_pointer_mut(&mut self) -> *mut Value { match self { Operand::FieldPointerMut(p) => *p, _ => panic!("Attempt to unwrap {:?} as FieldPointerMut", self), } } } impl Default for Operand { fn default() -> Self { Operand::Null } } impl Clone for Operand { fn clone(&self) -> Self { match self { Operand::Value(value) => Operand::Value(Value::clone(value)), Operand::FieldPointer(field_ref) => Operand::FieldPointer(*field_ref), Operand::FieldPointerMut(_) => { panic!("Cannot clone FieldRefMut") } Operand::Null => Operand::Null, } } }