use lief_ffi as ffi;
use crate::{assembly::mips::registers::Reg, common::FromFFI};
use super::Operand;
pub struct Memory {
ptr: cxx::UniquePtr<ffi::asm_mips_operands_Memory>,
}
impl FromFFI<ffi::asm_mips_operands_Memory> for Memory {
fn from_ffi(ptr: cxx::UniquePtr<ffi::asm_mips_operands_Memory>) -> Self {
Self { ptr }
}
}
impl Operand for Memory {
#[doc(hidden)]
fn as_generic(&self) -> &ffi::asm_mips_Operand {
self.ptr.as_ref().unwrap().as_ref()
}
}
#[derive(Debug)]
pub enum Offset {
Reg(Reg),
Displacement(i64),
}
impl Memory {
pub fn base(&self) -> Reg {
Reg::from(self.ptr.base())
}
pub fn offset(&self) -> Option<Offset> {
let ffi_offset = self.ptr.offset();
match ffi_offset.enum_type {
1 => Some(Offset::Reg(Reg::from(ffi_offset.value))),
2 => Some(Offset::Displacement(ffi_offset.value as i64)),
_ => None,
}
}
}