rapx/analysis/points_to/
slot.rs1#[derive(Debug, Clone, Hash, PartialEq, Eq)]
3pub struct Slot {
4 pub local: usize,
5 pub fields: Vec<usize>,
6}
7
8impl Slot {
9 pub fn new(local: usize) -> Self {
10 Slot {
11 local,
12 fields: Vec::new(),
13 }
14 }
15
16 pub fn project(&self, field_idx: usize) -> Self {
17 let mut fields = self.fields.clone();
18 fields.push(field_idx);
19 Slot {
20 local: self.local,
21 fields,
22 }
23 }
24
25 pub fn from_mir_place(place: &rustc_middle::mir::Place) -> Self {
26 let local = place.local.as_usize();
27 let fields: Vec<usize> = place
28 .projection
29 .iter()
30 .filter_map(|elem| match elem {
31 rustc_middle::mir::ProjectionElem::Field(idx, _) => Some(idx.as_usize()),
32 _ => None,
33 })
34 .collect();
35 Slot { local, fields }
36 }
37}
38
39#[derive(Debug, Clone, Hash, PartialEq, Eq)]
41pub enum AbstractLoc {
42 Slot(Slot),
43 Null,
44}