use super::{Name, Offset, Type};
use std::fmt;
#[derive(Clone)]
pub struct Field<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
dwarf: &'dwarf crate::gimli::Dwarf<R>,
unit: &'dwarf crate::gimli::Unit<R, usize>,
entry: crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R>,
}
impl<'dwarf, R> Field<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
pub(crate) fn from_dw_tag_member(
dwarf: &'dwarf crate::gimli::Dwarf<R>,
unit: &'dwarf crate::gimli::Unit<R, usize>,
entry: crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R>,
) -> Result<Self, crate::Error> {
let _tree = unit.entries_tree(Some(entry.offset()))?;
crate::check_tag(&entry, crate::gimli::DW_TAG_member)?;
Ok(Self { dwarf, unit, entry })
}
#[allow(dead_code)]
pub(crate) fn dwarf(&self) -> &'dwarf crate::gimli::Dwarf<R> {
self.dwarf
}
#[allow(dead_code)]
pub(crate) fn unit(&self) -> &crate::gimli::Unit<R, usize> {
self.unit
}
#[allow(dead_code)]
pub(crate) fn entry(&self) -> &crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R> {
&self.entry
}
pub fn name(&self) -> Result<Name<R>, crate::Error> {
Name::from_die(self.dwarf(), self.unit(), self.entry())
}
pub fn size(&self) -> Result<Option<u64>, crate::Error> {
crate::get_size_opt(self.entry())
}
pub fn align(&self) -> Result<Option<u64>, crate::Error> {
crate::get_align(self.entry())
}
pub fn offset(&'dwarf self) -> Result<Offset<'dwarf, R>, crate::Error> {
Offset::from_die(self.unit(), self.entry())
}
pub fn r#type(&self) -> Result<Type<'dwarf, R>, crate::Error> {
let r#type = crate::get_type_res(self.unit, &self.entry)?;
super::Type::from_die(self.dwarf, self.unit, r#type)
}
}
impl<'dwarf, R> fmt::Display for Field<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.name().map_err(crate::fmt_err)?.fmt(f)
}
}