deflect/value/
slice_impl.rs

1use std::fmt;
2
3/// A reflected slice value.
4pub struct Slice<'value, 'dwarf, P = crate::DefaultProvider>
5where
6    P: crate::DebugInfoProvider,
7{
8    value: crate::Bytes<'value>,
9    schema: crate::schema::Slice<'dwarf, P::Reader>,
10    provider: &'dwarf P,
11}
12
13impl<'dwarf, R> crate::schema::Slice<'dwarf, R>
14where
15    R: crate::gimli::Reader<Offset = std::primitive::usize>,
16{
17    pub(crate) unsafe fn with_bytes<'value, P>(
18        self,
19        provider: &'dwarf P,
20        bytes: crate::Bytes<'value>,
21    ) -> Result<Slice<'value, 'dwarf, P>, crate::Error>
22    where
23        P: crate::DebugInfoProvider<Reader = R>,
24    {
25        Ok(Slice {
26            value: bytes,
27            schema: self,
28            provider,
29        })
30    }
31}
32
33impl<'value, 'dwarf, P> Slice<'value, 'dwarf, P>
34where
35    P: crate::DebugInfoProvider,
36{
37    /// The schema of this value.
38    pub fn schema(&self) -> &crate::schema::Slice<'dwarf, P::Reader> {
39        &self.schema
40    }
41
42    /// The value of the `data_ptr` field of this slice.
43    pub fn data_ptr(&self) -> Result<crate::Bytes<'value>, crate::Error> {
44        let field =
45            unsafe { super::Field::new(self.schema.data_ptr().clone(), self.value, self.provider) };
46        let value = field.value()?;
47        let value: super::Pointer<crate::schema::Mut, _> = value.try_into()?;
48        let ptr = value.deref_raw()?;
49        Ok(ptr)
50    }
51
52    /// The value of the `length` field of this slice.
53    pub fn length(&self) -> Result<usize, crate::Error> {
54        let field =
55            unsafe { super::Field::new(self.schema.length().clone(), self.value, self.provider) };
56        let value = field.value()?;
57        let len: usize = value.try_into()?;
58        Ok(len)
59    }
60
61    /// An iterator over values of this slice.
62    pub fn iter(&self) -> Result<super::Iter<'value, 'dwarf, P>, crate::Error> {
63        let elt_type = self.schema.elt()?;
64        let elt_size = elt_type.size()?;
65        let elt_size = usize::try_from(elt_size)?;
66
67        let length = self.length()?;
68        let bytes = elt_size * length;
69
70        let value = self.data_ptr()?.as_ptr();
71        let value = std::ptr::slice_from_raw_parts(value, bytes);
72        let value = unsafe { &*value };
73
74        Ok(unsafe { super::Iter::new(value, elt_size, elt_type, length, self.provider) })
75    }
76}
77
78impl<'value, 'dwarf, P> fmt::Debug for Slice<'value, 'dwarf, P>
79where
80    P: crate::DebugInfoProvider,
81{
82    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83        let mut debug_struct = f.debug_struct("deflect::value::Slice");
84        debug_struct.field("schema", &self.schema);
85        debug_struct.field("value", &self.value);
86        debug_struct.finish()
87    }
88}
89
90impl<'value, 'dwarf, P> fmt::Display for Slice<'value, 'dwarf, P>
91where
92    P: crate::DebugInfoProvider,
93{
94    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
95        f.write_str("&")?;
96        let mut debug_list = f.debug_list();
97        for maybe_elt in self.iter().map_err(crate::fmt_err)? {
98            let elt = maybe_elt.map_err(crate::fmt_err)?;
99            debug_list.entry(&crate::DebugDisplay(elt));
100        }
101        debug_list.finish()
102    }
103}