deimos-lang/dvm-lib/src/vm/operand.rs
2026-03-13 09:16:41 -05:00

52 lines
1.3 KiB
Rust

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,
}
}
}