From e3d6ef8492c1f4f7f12cc895e8f3dba597fbf289 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Wed, 22 Nov 2023 12:59:03 -0500 Subject: [PATCH] dwarf dump: Fix padding handling within tag children Fixes #9 --- src/util/dwarf.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/util/dwarf.rs b/src/util/dwarf.rs index fa7e1c7..0fbc443 100644 --- a/src/util/dwarf.rs +++ b/src/util/dwarf.rs @@ -373,20 +373,19 @@ impl Tag { pub fn children<'a>(&self, tags: &'a TagMap) -> Vec<&'a Tag> { let sibling = self.next_sibling(tags); let mut children = Vec::new(); - let (_, mut child) = match tags.range(self.key + 1..).next() { + let mut child = match self.next_tag(tags) { Some(child) => child, None => return children, }; - if child.kind == TagKind::Padding { - return children; - } loop { if let Some(end) = sibling { if child.key == end.key { break; } } - children.push(child); + if child.kind != TagKind::Padding { + children.push(child); + } match child.next_sibling(tags) { Some(next) => child = next, None => break, @@ -395,15 +394,18 @@ impl Tag { children } + /// Returns the next sibling tag, if any pub fn next_sibling<'a>(&self, tags: &'a TagMap) -> Option<&'a Tag> { if let Some(key) = self.reference_attribute(AttributeKind::Sibling) { - if let Some(next) = tags.get(&key) { - if next.kind != TagKind::Padding { - return Some(next); - } - } + tags.get(&key) + } else { + self.next_tag(tags) } - None + } + + /// Returns the next tag sequentially, if any + pub fn next_tag<'a>(&self, tags: &'a TagMap) -> Option<&'a Tag> { + tags.range(self.key + 1..).next().map(|(_, tag)| tag) } }