52 lines
1.3 KiB
Rust
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,
|
|
}
|
|
}
|
|
}
|