use core::ops::Deref; use crate::{ unwinder::UnwinderInternal, AllocationPolicy, Error, FrameAddress, MayAllocateDuringUnwind, Module, Unwinder, }; use super::{ArchAarch64, CacheAarch64, UnwindRegsAarch64}; /// The unwinder for the Aarch64 CPU architecture. Use the [`Unwinder`] trait for unwinding. /// /// Type arguments: /// /// - `D`: The type for unwind section data in the modules. See [`Module`]. /// - `P`: The [`AllocationPolicy`]. pub struct UnwinderAarch64(UnwinderInternal); impl Default for UnwinderAarch64 { fn default() -> Self { Self::new() } } impl Clone for UnwinderAarch64 { fn clone(&self) -> Self { Self(self.0.clone()) } } impl UnwinderAarch64 { /// Create an unwinder for a process. pub fn new() -> Self { Self(UnwinderInternal::new()) } } impl, P: AllocationPolicy> Unwinder for UnwinderAarch64 { type UnwindRegs = UnwindRegsAarch64; type Cache = CacheAarch64

; type Module = Module; fn add_module(&mut self, module: Module) { self.0.add_module(module); } fn remove_module(&mut self, module_address_range_start: u64) { self.0.remove_module(module_address_range_start); } fn max_known_code_address(&self) -> u64 { self.0.max_known_code_address() } fn unwind_frame( &self, address: FrameAddress, regs: &mut UnwindRegsAarch64, cache: &mut CacheAarch64

, read_stack: &mut F, ) -> Result, Error> where F: FnMut(u64) -> Result, { self.0.unwind_frame(address, regs, &mut cache.0, read_stack) } }