#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub struct Slot {
pub local: usize,
pub fields: Vec<usize>,
}
impl Slot {
pub fn new(local: usize) -> Self {
Slot {
local,
fields: Vec::new(),
}
}
pub fn project(&self, field_idx: usize) -> Self {
let mut fields = self.fields.clone();
fields.push(field_idx);
Slot {
local: self.local,
fields,
}
}
pub fn from_mir_place(place: &rustc_middle::mir::Place) -> Self {
let local = place.local.as_usize();
let fields: Vec<usize> = place
.projection
.iter()
.filter_map(|elem| match elem {
rustc_middle::mir::ProjectionElem::Field(idx, _) => Some(idx.as_usize()),
_ => None,
})
.collect();
Slot { local, fields }
}
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub enum AbstractLoc {
Slot(Slot),
Null,
}