use core::ops::Deref; use super::arch::ArchX86_64; use super::cache::CacheX86_64; use super::unwindregs::UnwindRegsX86_64; use crate::cache::{AllocationPolicy, MayAllocateDuringUnwind}; use crate::error::Error; use crate::unwinder::UnwinderInternal; use crate::unwinder::{Module, Unwinder}; use crate::FrameAddress; /// The unwinder for the x86_64 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 UnwinderX86_64(UnwinderInternal); impl Default for UnwinderX86_64 { fn default() -> Self { Self::new() } } impl Clone for UnwinderX86_64 { fn clone(&self) -> Self { Self(self.0.clone()) } } impl UnwinderX86_64 { /// Create an unwinder for a process. pub fn new() -> Self { Self(UnwinderInternal::new()) } } impl, P: AllocationPolicy> Unwinder for UnwinderX86_64 { type UnwindRegs = UnwindRegsX86_64; type Cache = CacheX86_64

; 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 UnwindRegsX86_64, cache: &mut CacheX86_64

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