use crate::modeling::machine::cpu::concrete::ConcretePcodeAddress;
use jingle_sleigh::context::loaded::LoadedSleighContext;
use std::borrow::Borrow;
pub use jingle_sleigh::PcodeOpRef;
pub trait PcodeStore<'op> {
fn get_pcode_op_at<T: Borrow<ConcretePcodeAddress>>(
&'op self,
addr: T,
) -> Option<PcodeOpRef<'op>>;
}
pub trait EntryPoint {
fn get_entry(&self) -> ConcretePcodeAddress;
}
impl<'a> PcodeStore<'a> for LoadedSleighContext<'a> {
fn get_pcode_op_at<T: Borrow<ConcretePcodeAddress>>(
&'a self,
addr: T,
) -> Option<PcodeOpRef<'a>> {
let addr = addr.borrow();
let instr = self.instruction_at(addr.machine())?;
instr
.ops
.get(addr.pcode() as usize)
.cloned()
.map(PcodeOpRef::from)
}
}
impl<'op, T: PcodeStore<'op> + ?Sized> PcodeStore<'op> for &T {
fn get_pcode_op_at<B: Borrow<ConcretePcodeAddress>>(
&'op self,
addr: B,
) -> Option<PcodeOpRef<'op>> {
(*self).get_pcode_op_at(addr)
}
}