use super::Name;
use std::fmt;
#[derive(Clone)]
pub struct Function<'dwarf, R: crate::gimli::Reader<Offset = usize>>
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> Function<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
pub(crate) fn from_dw_tag_subroutine_type(
dwarf: &'dwarf crate::gimli::Dwarf<R>,
unit: &'dwarf crate::gimli::Unit<R, usize>,
entry: crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R>,
) -> Result<Self, crate::Error> {
crate::check_tag(&entry, crate::gimli::DW_TAG_subroutine_type)?;
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> {
println!(
"{:?}",
crate::debug::DebugEntry::new(self.dwarf, self.unit, &self.entry)
);
Name::from_die(self.dwarf(), self.unit(), self.entry())
}
}
impl<'dwarf, R> fmt::Debug for Function<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut debug_tuple = f.debug_tuple("deflect::schema::Function");
debug_tuple.field(&crate::debug::DebugEntry::new(
self.dwarf,
self.unit,
&self.entry,
));
debug_tuple.finish()
}
}
impl<'dwarf, R> fmt::Display for Function<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("fn()")
}
}