Coverage Report

Created: 2026-03-26 07:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/gimli-0.33.0/src/read/pubnames.rs
Line
Count
Source
1
use crate::common::{DebugInfoOffset, SectionId};
2
use crate::endianity::Endianity;
3
use crate::read::lookup::{DebugLookup, LookupEntryIter, PubStuffEntry, PubStuffParser};
4
use crate::read::{EndianSlice, Reader, Result, Section, UnitOffset};
5
6
/// A single parsed pubname.
7
#[derive(Debug, Clone)]
8
pub struct PubNamesEntry<R: Reader> {
9
    unit_header_offset: DebugInfoOffset<R::Offset>,
10
    die_offset: UnitOffset<R::Offset>,
11
    name: R,
12
}
13
14
impl<R: Reader> PubNamesEntry<R> {
15
    /// Returns the name this entry refers to.
16
0
    pub fn name(&self) -> &R {
17
0
        &self.name
18
0
    }
19
20
    /// Returns the offset into the .debug_info section for the header of the compilation unit
21
    /// which contains this name.
22
0
    pub fn unit_header_offset(&self) -> DebugInfoOffset<R::Offset> {
23
0
        self.unit_header_offset
24
0
    }
25
26
    /// Returns the offset into the compilation unit for the debugging information entry which
27
    /// has this name.
28
0
    pub fn die_offset(&self) -> UnitOffset<R::Offset> {
29
0
        self.die_offset
30
0
    }
31
}
32
33
impl<R: Reader> PubStuffEntry<R> for PubNamesEntry<R> {
34
0
    fn new(
35
0
        die_offset: UnitOffset<R::Offset>,
36
0
        name: R,
37
0
        unit_header_offset: DebugInfoOffset<R::Offset>,
38
0
    ) -> Self {
39
0
        PubNamesEntry {
40
0
            unit_header_offset,
41
0
            die_offset,
42
0
            name,
43
0
        }
44
0
    }
45
}
46
47
/// The `DebugPubNames` struct represents the DWARF public names information
48
/// found in the `.debug_pubnames` section.
49
#[derive(Debug, Clone)]
50
pub struct DebugPubNames<R: Reader>(DebugLookup<R, PubStuffParser<R, PubNamesEntry<R>>>);
51
52
impl<'input, Endian> DebugPubNames<EndianSlice<'input, Endian>>
53
where
54
    Endian: Endianity,
55
{
56
    /// Construct a new `DebugPubNames` instance from the data in the `.debug_pubnames`
57
    /// section.
58
    ///
59
    /// It is the caller's responsibility to read the `.debug_pubnames` section and
60
    /// present it as a `&[u8]` slice. That means using some ELF loader on
61
    /// Linux, a Mach-O loader on macOS, etc.
62
    ///
63
    /// ```
64
    /// use gimli::{DebugPubNames, LittleEndian};
65
    ///
66
    /// # let buf = [];
67
    /// # let read_debug_pubnames_section_somehow = || &buf;
68
    /// let debug_pubnames =
69
    ///     DebugPubNames::new(read_debug_pubnames_section_somehow(), LittleEndian);
70
    /// ```
71
0
    pub fn new(debug_pubnames_section: &'input [u8], endian: Endian) -> Self {
72
0
        Self::from(EndianSlice::new(debug_pubnames_section, endian))
73
0
    }
74
}
75
76
impl<R: Reader> DebugPubNames<R> {
77
    /// Iterate the pubnames in the `.debug_pubnames` section.
78
    ///
79
    /// ```
80
    /// use gimli::{DebugPubNames, EndianSlice, LittleEndian};
81
    ///
82
    /// # let buf = [];
83
    /// # let read_debug_pubnames_section_somehow = || &buf;
84
    /// let debug_pubnames =
85
    ///     DebugPubNames::new(read_debug_pubnames_section_somehow(), LittleEndian);
86
    ///
87
    /// let mut iter = debug_pubnames.items();
88
    /// while let Some(pubname) = iter.next().unwrap() {
89
    ///   println!("pubname {} found!", pubname.name().to_string_lossy());
90
    /// }
91
    /// ```
92
0
    pub fn items(&self) -> PubNamesEntryIter<R> {
93
0
        PubNamesEntryIter(self.0.items())
94
0
    }
95
}
96
97
impl<R: Reader> Section<R> for DebugPubNames<R> {
98
0
    fn id() -> SectionId {
99
0
        SectionId::DebugPubNames
100
0
    }
101
102
0
    fn reader(&self) -> &R {
103
0
        self.0.reader()
104
0
    }
105
}
106
107
impl<R: Reader> From<R> for DebugPubNames<R> {
108
0
    fn from(debug_pubnames_section: R) -> Self {
109
0
        DebugPubNames(DebugLookup::from(debug_pubnames_section))
110
0
    }
111
}
112
113
/// An iterator over the pubnames from a `.debug_pubnames` section.
114
#[derive(Debug, Clone)]
115
pub struct PubNamesEntryIter<R: Reader>(LookupEntryIter<R, PubStuffParser<R, PubNamesEntry<R>>>);
116
117
impl<R: Reader> PubNamesEntryIter<R> {
118
    /// Advance the iterator and return the next pubname.
119
    ///
120
    /// Returns the newly parsed pubname as `Ok(Some(pubname))`. Returns
121
    /// `Ok(None)` when iteration is complete and all pubnames have already been
122
    /// parsed and yielded. If an error occurs while parsing the next pubname,
123
    /// then this error is returned as `Err(e)`, and all subsequent calls return
124
    /// `Ok(None)`.
125
0
    pub fn next(&mut self) -> Result<Option<PubNamesEntry<R>>> {
126
0
        self.0.next()
127
0
    }
128
}
129
130
#[cfg(feature = "fallible-iterator")]
131
impl<R: Reader> fallible_iterator::FallibleIterator for PubNamesEntryIter<R> {
132
    type Item = PubNamesEntry<R>;
133
    type Error = crate::read::Error;
134
135
    fn next(&mut self) -> ::core::result::Result<Option<Self::Item>, Self::Error> {
136
        self.0.next()
137
    }
138
}
139
140
impl<R: Reader> Iterator for PubNamesEntryIter<R> {
141
    type Item = Result<PubNamesEntry<R>>;
142
143
0
    fn next(&mut self) -> Option<Self::Item> {
144
0
        self.0.next().transpose()
145
0
    }
146
}