use super::types::{MethodRef, MethodSpan, MethodTable};
impl MethodTable {
pub(in super::super) fn spans(&self) -> &[MethodSpan] {
&self.spans
}
pub fn methods(&self) -> impl Iterator<Item = (usize, usize, &MethodRef)> {
self.spans.iter().map(|s| (s.start, s.end, &s.method))
}
#[must_use]
pub fn method_for_offset(&self, offset: usize) -> MethodRef {
match self.spans.binary_search_by_key(&offset, |span| span.start) {
Ok(index) => self.spans[index].method.clone(),
Err(0) => self
.spans
.first()
.map(|span| span.method.clone())
.unwrap_or_else(|| MethodRef::synthetic(offset)),
Err(index) => {
let span = &self.spans[index - 1];
span.method.clone()
}
}
}
#[must_use]
pub fn resolve_internal_target(&self, target_offset: usize) -> MethodRef {
match self
.spans
.binary_search_by_key(&target_offset, |span| span.start)
{
Ok(index) => self.spans[index].method.clone(),
Err(_) => MethodRef::synthetic(target_offset),
}
}
#[must_use]
pub fn manifest_index_for_start(&self, offset: usize) -> Option<usize> {
self.manifest_index_by_start.get(&offset).copied()
}
}