blob: 5b0dc3084b748a91563526f77605d646cf1abf4e [file] [log] [blame]
use core::ffi::c_void;
use core::marker::PhantomData;
use super::super::backtrace::miri::{resolve_addr, Frame};
use super::BytesOrWideString;
use super::{ResolveWhat, SymbolName};
pub unsafe fn resolve(what: ResolveWhat<'_>, cb: &mut dyn FnMut(&super::Symbol)) {
let sym = match what {
ResolveWhat::Address(addr) => Symbol {
inner: resolve_addr(addr),
_unused: PhantomData,
},
ResolveWhat::Frame(frame) => Symbol {
inner: frame.inner.clone(),
_unused: PhantomData,
},
};
cb(&super::Symbol { inner: sym })
}
pub struct Symbol<'a> {
inner: Frame,
_unused: PhantomData<&'a ()>,
}
impl<'a> Symbol<'a> {
pub fn name(&self) -> Option<SymbolName<'_>> {
Some(SymbolName::new(&self.inner.inner.name))
}
pub fn addr(&self) -> Option<*mut c_void> {
Some(self.inner.addr)
}
pub fn filename_raw(&self) -> Option<BytesOrWideString<'_>> {
Some(BytesOrWideString::Bytes(&self.inner.inner.filename))
}
pub fn lineno(&self) -> Option<u32> {
Some(self.inner.inner.lineno)
}
pub fn colno(&self) -> Option<u32> {
Some(self.inner.inner.colno)
}
#[cfg(feature = "std")]
pub fn filename(&self) -> Option<&std::path::Path> {
Some(std::path::Path::new(
core::str::from_utf8(&self.inner.inner.filename).unwrap(),
))
}
}
pub unsafe fn clear_symbol_cache() {}