use crate::display::JingleDisplayable;
use crate::modeling::{ModeledInstruction, ModelingContext};
use crate::python::resolved_varnode::PythonResolvedVarNode;
use crate::python::state::PythonState;
use crate::python::varode_iterator::VarNodeIterator;
use jingle_sleigh::{Instruction, SleighArchInfo};
use pyo3::{PyResult, pyclass, pymethods};
use std::borrow::Borrow;
#[pyclass(unsendable, name = "ModeledInstruction")]
pub struct PythonModeledInstruction {
instr: ModeledInstruction,
}
impl PythonModeledInstruction {
pub fn new<T: Borrow<SleighArchInfo>>(
instr: Instruction,
info: T,
) -> PyResult<PythonModeledInstruction> {
Ok(Self {
instr: ModeledInstruction::new(instr, info)?,
})
}
}
#[pymethods]
impl PythonModeledInstruction {
#[getter]
pub fn original_state(&self) -> PythonState {
PythonState::from(self.instr.get_original_state().clone())
}
#[getter]
pub fn final_state(&self) -> PythonState {
PythonState::from(self.instr.get_final_state().clone())
}
pub fn get_input_vns(&self) -> PyResult<VarNodeIterator> {
let s = self.instr.get_arch_info().clone();
let filtered: Vec<PythonResolvedVarNode> = self
.instr
.get_inputs()
.into_iter()
.map(|g| PythonResolvedVarNode::from(g.display(&s)))
.collect();
let filtered = filtered.into_iter();
Ok(VarNodeIterator::new(filtered.into_iter()))
}
pub fn get_output_vns(&self) -> PyResult<VarNodeIterator> {
let s = self.instr.get_arch_info().clone();
let filtered: Vec<PythonResolvedVarNode> = self
.instr
.get_outputs()
.into_iter()
.map(|g| PythonResolvedVarNode::from(g.display(&s)))
.collect();
let filtered = filtered.into_iter();
Ok(VarNodeIterator::new(filtered.into_iter()))
}
}