Change traits to bare FnMut where possible.
This commit is contained in:
@@ -69,24 +69,48 @@ where
|
|||||||
F: FnOnce(Option<&str>) -> io::Result<()>,
|
F: FnOnce(Option<&str>) -> io::Result<()>,
|
||||||
{
|
{
|
||||||
match context.StackWalkVariant {
|
match context.StackWalkVariant {
|
||||||
StackWalkVariant::StackWalkEx(_, ref fns) => {
|
StackWalkVariant::StackWalkEx(_, ref fns) => resolve_symname_internal(
|
||||||
resolve_symname_internal(fns.resolve_symname, frame, callback, context)
|
|process: c::HANDLE,
|
||||||
}
|
symbol_address: u64,
|
||||||
StackWalkVariant::StackWalk64(_, ref fns) => {
|
inline_context: c::ULONG,
|
||||||
resolve_symname_internal(fns.resolve_symname, frame, callback, context)
|
info: *mut c::SYMBOL_INFO| unsafe {
|
||||||
}
|
let mut displacement = 0u64;
|
||||||
|
(fns.resolve_symname)(
|
||||||
|
process,
|
||||||
|
symbol_address,
|
||||||
|
inline_context,
|
||||||
|
&mut displacement,
|
||||||
|
info,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
frame,
|
||||||
|
callback,
|
||||||
|
context,
|
||||||
|
),
|
||||||
|
StackWalkVariant::StackWalk64(_, ref fns) => resolve_symname_internal(
|
||||||
|
|process: c::HANDLE,
|
||||||
|
symbol_address: u64,
|
||||||
|
_inline_context: c::ULONG,
|
||||||
|
info: *mut c::SYMBOL_INFO| unsafe {
|
||||||
|
let mut displacement = 0u64;
|
||||||
|
(fns.resolve_symname)(process, symbol_address, &mut displacement, info)
|
||||||
|
},
|
||||||
|
frame,
|
||||||
|
callback,
|
||||||
|
context,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_symname_internal<F, R>(
|
fn resolve_symname_internal<F, R>(
|
||||||
symbol_resolver: R,
|
mut symbol_resolver: R,
|
||||||
frame: Frame,
|
frame: Frame,
|
||||||
callback: F,
|
callback: F,
|
||||||
context: &BacktraceContext,
|
context: &BacktraceContext,
|
||||||
) -> io::Result<()>
|
) -> io::Result<()>
|
||||||
where
|
where
|
||||||
F: FnOnce(Option<&str>) -> io::Result<()>,
|
F: FnOnce(Option<&str>) -> io::Result<()>,
|
||||||
R: SymbolResolver,
|
R: FnMut(c::HANDLE, u64, c::ULONG, *mut c::SYMBOL_INFO) -> c::BOOL,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut info: c::SYMBOL_INFO = mem::zeroed();
|
let mut info: c::SYMBOL_INFO = mem::zeroed();
|
||||||
@@ -96,7 +120,7 @@ where
|
|||||||
// due to struct alignment.
|
// due to struct alignment.
|
||||||
info.SizeOfStruct = 88;
|
info.SizeOfStruct = 88;
|
||||||
|
|
||||||
let ret = symbol_resolver.resolve_symbol(
|
let ret = symbol_resolver(
|
||||||
context.handle,
|
context.handle,
|
||||||
frame.symbol_addr as u64,
|
frame.symbol_addr as u64,
|
||||||
frame.inline_context,
|
frame.inline_context,
|
||||||
@@ -121,52 +145,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trait SymbolResolver {
|
|
||||||
fn resolve_symbol(
|
|
||||||
&self,
|
|
||||||
process: c::HANDLE,
|
|
||||||
symbol_address: u64,
|
|
||||||
inline_context: c::ULONG,
|
|
||||||
info: *mut c::SYMBOL_INFO,
|
|
||||||
) -> c::BOOL;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl SymbolResolver for SymFromAddrFn {
|
|
||||||
fn resolve_symbol(
|
|
||||||
&self,
|
|
||||||
process: c::HANDLE,
|
|
||||||
symbol_address: u64,
|
|
||||||
_inline_context: c::ULONG,
|
|
||||||
info: *mut c::SYMBOL_INFO,
|
|
||||||
) -> c::BOOL {
|
|
||||||
unsafe {
|
|
||||||
let mut displacement = 0u64;
|
|
||||||
self(process, symbol_address, &mut displacement, info)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl SymbolResolver for SymFromInlineContextFn {
|
|
||||||
fn resolve_symbol(
|
|
||||||
&self,
|
|
||||||
process: c::HANDLE,
|
|
||||||
symbol_address: u64,
|
|
||||||
inline_context: c::ULONG,
|
|
||||||
info: *mut c::SYMBOL_INFO,
|
|
||||||
) -> c::BOOL {
|
|
||||||
unsafe {
|
|
||||||
let mut displacement = 0u64;
|
|
||||||
self(
|
|
||||||
process,
|
|
||||||
symbol_address,
|
|
||||||
inline_context,
|
|
||||||
&mut displacement,
|
|
||||||
info,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn foreach_symbol_fileline<F>(
|
pub fn foreach_symbol_fileline<F>(
|
||||||
frame: Frame,
|
frame: Frame,
|
||||||
callback: F,
|
callback: F,
|
||||||
@@ -176,30 +154,55 @@ where
|
|||||||
F: FnMut(&[u8], u32) -> io::Result<()>,
|
F: FnMut(&[u8], u32) -> io::Result<()>,
|
||||||
{
|
{
|
||||||
match context.StackWalkVariant {
|
match context.StackWalkVariant {
|
||||||
StackWalkVariant::StackWalkEx(_, ref fns) => {
|
StackWalkVariant::StackWalkEx(_, ref fns) => foreach_symbol_fileline_iternal(
|
||||||
foreach_symbol_fileline_iternal(fns.sym_get_line, frame, callback, context)
|
|process: c::HANDLE,
|
||||||
}
|
frame_address: u64,
|
||||||
StackWalkVariant::StackWalk64(_, ref fns) => {
|
inline_context: c::ULONG,
|
||||||
foreach_symbol_fileline_iternal(fns.sym_get_line, frame, callback, context)
|
line: *mut c::IMAGEHLP_LINE64| unsafe {
|
||||||
}
|
let mut displacement = 0u32;
|
||||||
|
(fns.sym_get_line)(
|
||||||
|
process,
|
||||||
|
frame_address,
|
||||||
|
inline_context,
|
||||||
|
0,
|
||||||
|
&mut displacement,
|
||||||
|
line,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
frame,
|
||||||
|
callback,
|
||||||
|
context,
|
||||||
|
),
|
||||||
|
StackWalkVariant::StackWalk64(_, ref fns) => foreach_symbol_fileline_iternal(
|
||||||
|
|process: c::HANDLE,
|
||||||
|
frame_address: u64,
|
||||||
|
_inline_context: c::ULONG,
|
||||||
|
line: *mut c::IMAGEHLP_LINE64| unsafe {
|
||||||
|
let mut displacement = 0u32;
|
||||||
|
(fns.sym_get_line)(process, frame_address, &mut displacement, line)
|
||||||
|
},
|
||||||
|
frame,
|
||||||
|
callback,
|
||||||
|
context,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn foreach_symbol_fileline_iternal<F, G>(
|
fn foreach_symbol_fileline_iternal<F, G>(
|
||||||
line_getter: G,
|
mut line_getter: G,
|
||||||
frame: Frame,
|
frame: Frame,
|
||||||
mut callback: F,
|
mut callback: F,
|
||||||
context: &BacktraceContext,
|
context: &BacktraceContext,
|
||||||
) -> io::Result<bool>
|
) -> io::Result<bool>
|
||||||
where
|
where
|
||||||
F: FnMut(&[u8], u32) -> io::Result<()>,
|
F: FnMut(&[u8], u32) -> io::Result<()>,
|
||||||
G: LineGetter,
|
G: FnMut(c::HANDLE, u64, c::ULONG, *mut c::IMAGEHLP_LINE64) -> c::BOOL,
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut line: c::IMAGEHLP_LINE64 = mem::zeroed();
|
let mut line: c::IMAGEHLP_LINE64 = mem::zeroed();
|
||||||
line.SizeOfStruct = ::mem::size_of::<c::IMAGEHLP_LINE64>() as u32;
|
line.SizeOfStruct = ::mem::size_of::<c::IMAGEHLP_LINE64>() as u32;
|
||||||
|
|
||||||
let ret = line_getter.get_line(
|
let ret = line_getter(
|
||||||
context.handle,
|
context.handle,
|
||||||
frame.exact_position as u64,
|
frame.exact_position as u64,
|
||||||
frame.inline_context,
|
frame.inline_context,
|
||||||
@@ -212,50 +215,3 @@ where
|
|||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trait LineGetter {
|
|
||||||
fn get_line(
|
|
||||||
&self,
|
|
||||||
process: c::HANDLE,
|
|
||||||
frame_address: u64,
|
|
||||||
inline_context: c::ULONG,
|
|
||||||
line: *mut c::IMAGEHLP_LINE64,
|
|
||||||
) -> c::BOOL;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl LineGetter for SymGetLineFromAddr64Fn {
|
|
||||||
fn get_line(
|
|
||||||
&self,
|
|
||||||
process: c::HANDLE,
|
|
||||||
frame_address: u64,
|
|
||||||
_inline_context: c::ULONG,
|
|
||||||
line: *mut c::IMAGEHLP_LINE64,
|
|
||||||
) -> c::BOOL {
|
|
||||||
unsafe {
|
|
||||||
let mut displacement = 0u32;
|
|
||||||
self(process, frame_address, &mut displacement, line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl LineGetter for SymGetLineFromInlineContextFn {
|
|
||||||
fn get_line(
|
|
||||||
&self,
|
|
||||||
process: c::HANDLE,
|
|
||||||
frame_address: u64,
|
|
||||||
inline_context: c::ULONG,
|
|
||||||
line: *mut c::IMAGEHLP_LINE64,
|
|
||||||
) -> c::BOOL {
|
|
||||||
unsafe {
|
|
||||||
let mut displacement = 0u32;
|
|
||||||
self(
|
|
||||||
process,
|
|
||||||
frame_address,
|
|
||||||
inline_context,
|
|
||||||
0,
|
|
||||||
&mut displacement,
|
|
||||||
line,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user