Skip to main content

deflect/schema/
box.rs

1use std::fmt;
2
3/// A schema for a shared reference (i.e., `&T`).
4#[derive(Clone)]
5pub struct Box<'dwarf, R>
6where
7    R: crate::gimli::Reader<Offset = usize>,
8{
9    dwarf: &'dwarf crate::gimli::Dwarf<R>,
10    unit: &'dwarf crate::gimli::Unit<R, usize>,
11    entry: crate::gimli::UnitOffset,
12    name: Option<super::Name<R>>,
13    target: crate::gimli::UnitOffset,
14}
15
16impl<'dwarf, R> Box<'dwarf, R>
17where
18    R: crate::gimli::Reader<Offset = usize>,
19{
20    /// Construct a new `Shared`.
21    pub(super) fn new(
22        dwarf: &'dwarf crate::gimli::Dwarf<R>,
23        unit: &'dwarf crate::gimli::Unit<R, usize>,
24        entry: crate::gimli::UnitOffset,
25        name: Option<super::Name<R>>,
26        target: crate::gimli::UnitOffset,
27    ) -> Self {
28        Self {
29            dwarf,
30            unit,
31            entry,
32            name,
33            target,
34        }
35    }
36
37    /// The name of this reference type.
38    pub fn name(&self) -> Option<&super::Name<R>> {
39        self.name.as_ref()
40    }
41
42    /// The size of this type, in bytes.
43    pub fn size(&self) -> u64 {
44        core::mem::size_of::<usize>() as _
45    }
46
47    /// The type of the referent.
48    pub fn r#type(&self) -> Result<super::Type<'dwarf, R>, crate::Error> {
49        let entry = self.unit.entry(self.target)?;
50        super::Type::from_die(self.dwarf, self.unit, entry)
51    }
52}
53
54impl<'dwarf, R> fmt::Debug for Box<'dwarf, R>
55where
56    R: crate::gimli::Reader<Offset = usize>,
57{
58    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59        let entry = self.unit.entry(self.entry).map_err(crate::fmt_err)?;
60        let mut debug_tuple = f.debug_tuple("deflect::schema::Shared");
61        debug_tuple.field(&crate::debug::DebugEntry::new(
62            self.dwarf, self.unit, &entry,
63        ));
64        debug_tuple.finish()
65    }
66}
67
68impl<'dwarf, R> fmt::Display for Box<'dwarf, R>
69where
70    R: crate::gimli::Reader<Offset = usize>,
71{
72    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
73        if let Some(name) = self.name() {
74            name.fmt(f)
75        } else {
76            f.write_str("*? ")?;
77            let target = self.r#type().map_err(crate::fmt_err)?;
78            target.fmt(f)
79        }
80    }
81}