use lief_ffi as ffi;
use crate::common::{FromFFI, into_ranges};
use crate::{Range, declare_fwd_iterator, to_opt};
use std::marker::PhantomData;
pub struct LexicalBlock<'a> {
ptr: cxx::UniquePtr<ffi::DWARF_LexicalBlock>,
_owner: PhantomData<&'a ()>,
}
impl FromFFI<ffi::DWARF_LexicalBlock> for LexicalBlock<'_> {
fn from_ffi(ptr: cxx::UniquePtr<ffi::DWARF_LexicalBlock>) -> Self {
Self {
ptr,
_owner: PhantomData,
}
}
}
impl LexicalBlock<'_> {
pub fn name(&self) -> String {
self.ptr.name().to_string()
}
pub fn description(&self) -> String {
self.ptr.description().to_string()
}
pub fn sub_blocks(&self) -> LexicalBlocks<'_> {
LexicalBlocks::new(self.ptr.sub_blocks())
}
pub fn addr(&self) -> Option<u64> {
to_opt!(&lief_ffi::DWARF_LexicalBlock::addr, &self);
}
pub fn low_pc(&self) -> Option<u64> {
to_opt!(&lief_ffi::DWARF_LexicalBlock::low_pc, &self);
}
pub fn high_pc(&self) -> Option<u64> {
to_opt!(&lief_ffi::DWARF_LexicalBlock::high_pc, &self);
}
pub fn size(&self) -> u64 {
self.ptr.size()
}
pub fn ranges(&self) -> Vec<Range> {
into_ranges(self.ptr.ranges())
}
}
declare_fwd_iterator!(
LexicalBlocks,
LexicalBlock<'a>,
ffi::DWARF_LexicalBlock,
ffi::DWARF_LexicalBlock,
ffi::DWARF_LexicalBlock_it_sub_blocks
);