@@ -69,24 +69,48 @@ where
6969 F : FnOnce ( Option < & str > ) -> io:: Result < ( ) > ,
7070{
7171 match context. StackWalkVariant {
72- StackWalkVariant :: StackWalkEx ( _, ref fns) => {
73- resolve_symname_internal ( fns. resolve_symname , frame, callback, context)
74- }
75- StackWalkVariant :: StackWalk64 ( _, ref fns) => {
76- resolve_symname_internal ( fns. resolve_symname , frame, callback, context)
77- }
72+ StackWalkVariant :: StackWalkEx ( _, ref fns) => resolve_symname_internal (
73+ |process : c:: HANDLE ,
74+ symbol_address : u64 ,
75+ inline_context : c:: ULONG ,
76+ info : * mut c:: SYMBOL_INFO | unsafe {
77+ let mut displacement = 0u64 ;
78+ ( fns. resolve_symname ) (
79+ process,
80+ symbol_address,
81+ inline_context,
82+ & mut displacement,
83+ info,
84+ )
85+ } ,
86+ frame,
87+ callback,
88+ context,
89+ ) ,
90+ StackWalkVariant :: StackWalk64 ( _, ref fns) => resolve_symname_internal (
91+ |process : c:: HANDLE ,
92+ symbol_address : u64 ,
93+ _inline_context : c:: ULONG ,
94+ info : * mut c:: SYMBOL_INFO | unsafe {
95+ let mut displacement = 0u64 ;
96+ ( fns. resolve_symname ) ( process, symbol_address, & mut displacement, info)
97+ } ,
98+ frame,
99+ callback,
100+ context,
101+ ) ,
78102 }
79103}
80104
81105fn resolve_symname_internal < F , R > (
82- symbol_resolver : R ,
106+ mut symbol_resolver : R ,
83107 frame : Frame ,
84108 callback : F ,
85109 context : & BacktraceContext ,
86110) -> io:: Result < ( ) >
87111where
88112 F : FnOnce ( Option < & str > ) -> io:: Result < ( ) > ,
89- R : SymbolResolver ,
113+ R : FnMut ( c :: HANDLE , u64 , c :: ULONG , * mut c :: SYMBOL_INFO ) -> c :: BOOL ,
90114{
91115 unsafe {
92116 let mut info: c:: SYMBOL_INFO = mem:: zeroed ( ) ;
96120 // due to struct alignment.
97121 info. SizeOfStruct = 88 ;
98122
99- let ret = symbol_resolver. resolve_symbol (
123+ let ret = symbol_resolver (
100124 context. handle ,
101125 frame. symbol_addr as u64 ,
102126 frame. inline_context ,
@@ -121,52 +145,6 @@ where
121145 }
122146}
123147
124- trait SymbolResolver {
125- fn resolve_symbol (
126- & self ,
127- process : c:: HANDLE ,
128- symbol_address : u64 ,
129- inline_context : c:: ULONG ,
130- info : * mut c:: SYMBOL_INFO ,
131- ) -> c:: BOOL ;
132- }
133-
134- impl SymbolResolver for SymFromAddrFn {
135- fn resolve_symbol (
136- & self ,
137- process : c:: HANDLE ,
138- symbol_address : u64 ,
139- _inline_context : c:: ULONG ,
140- info : * mut c:: SYMBOL_INFO ,
141- ) -> c:: BOOL {
142- unsafe {
143- let mut displacement = 0u64 ;
144- self ( process, symbol_address, & mut displacement, info)
145- }
146- }
147- }
148-
149- impl SymbolResolver for SymFromInlineContextFn {
150- fn resolve_symbol (
151- & self ,
152- process : c:: HANDLE ,
153- symbol_address : u64 ,
154- inline_context : c:: ULONG ,
155- info : * mut c:: SYMBOL_INFO ,
156- ) -> c:: BOOL {
157- unsafe {
158- let mut displacement = 0u64 ;
159- self (
160- process,
161- symbol_address,
162- inline_context,
163- & mut displacement,
164- info,
165- )
166- }
167- }
168- }
169-
170148pub fn foreach_symbol_fileline < F > (
171149 frame : Frame ,
172150 callback : F ,
@@ -176,30 +154,55 @@ where
176154 F : FnMut ( & [ u8 ] , u32 ) -> io:: Result < ( ) > ,
177155{
178156 match context. StackWalkVariant {
179- StackWalkVariant :: StackWalkEx ( _, ref fns) => {
180- foreach_symbol_fileline_iternal ( fns. sym_get_line , frame, callback, context)
181- }
182- StackWalkVariant :: StackWalk64 ( _, ref fns) => {
183- foreach_symbol_fileline_iternal ( fns. sym_get_line , frame, callback, context)
184- }
157+ StackWalkVariant :: StackWalkEx ( _, ref fns) => foreach_symbol_fileline_iternal (
158+ |process : c:: HANDLE ,
159+ frame_address : u64 ,
160+ inline_context : c:: ULONG ,
161+ line : * mut c:: IMAGEHLP_LINE64 | unsafe {
162+ let mut displacement = 0u32 ;
163+ ( fns. sym_get_line ) (
164+ process,
165+ frame_address,
166+ inline_context,
167+ 0 ,
168+ & mut displacement,
169+ line,
170+ )
171+ } ,
172+ frame,
173+ callback,
174+ context,
175+ ) ,
176+ StackWalkVariant :: StackWalk64 ( _, ref fns) => foreach_symbol_fileline_iternal (
177+ |process : c:: HANDLE ,
178+ frame_address : u64 ,
179+ _inline_context : c:: ULONG ,
180+ line : * mut c:: IMAGEHLP_LINE64 | unsafe {
181+ let mut displacement = 0u32 ;
182+ ( fns. sym_get_line ) ( process, frame_address, & mut displacement, line)
183+ } ,
184+ frame,
185+ callback,
186+ context,
187+ ) ,
185188 }
186189}
187190
188191fn foreach_symbol_fileline_iternal < F , G > (
189- line_getter : G ,
192+ mut line_getter : G ,
190193 frame : Frame ,
191194 mut callback : F ,
192195 context : & BacktraceContext ,
193196) -> io:: Result < bool >
194197where
195198 F : FnMut ( & [ u8 ] , u32 ) -> io:: Result < ( ) > ,
196- G : LineGetter ,
199+ G : FnMut ( c :: HANDLE , u64 , c :: ULONG , * mut c :: IMAGEHLP_LINE64 ) -> c :: BOOL ,
197200{
198201 unsafe {
199202 let mut line: c:: IMAGEHLP_LINE64 = mem:: zeroed ( ) ;
200203 line. SizeOfStruct = :: mem:: size_of :: < c:: IMAGEHLP_LINE64 > ( ) as u32 ;
201204
202- let ret = line_getter. get_line (
205+ let ret = line_getter (
203206 context. handle ,
204207 frame. exact_position as u64 ,
205208 frame. inline_context ,
@@ -212,50 +215,3 @@ where
212215 Ok ( false )
213216 }
214217}
215-
216- trait LineGetter {
217- fn get_line (
218- & self ,
219- process : c:: HANDLE ,
220- frame_address : u64 ,
221- inline_context : c:: ULONG ,
222- line : * mut c:: IMAGEHLP_LINE64 ,
223- ) -> c:: BOOL ;
224- }
225-
226- impl LineGetter for SymGetLineFromAddr64Fn {
227- fn get_line (
228- & self ,
229- process : c:: HANDLE ,
230- frame_address : u64 ,
231- _inline_context : c:: ULONG ,
232- line : * mut c:: IMAGEHLP_LINE64 ,
233- ) -> c:: BOOL {
234- unsafe {
235- let mut displacement = 0u32 ;
236- self ( process, frame_address, & mut displacement, line)
237- }
238- }
239- }
240-
241- impl LineGetter for SymGetLineFromInlineContextFn {
242- fn get_line (
243- & self ,
244- process : c:: HANDLE ,
245- frame_address : u64 ,
246- inline_context : c:: ULONG ,
247- line : * mut c:: IMAGEHLP_LINE64 ,
248- ) -> c:: BOOL {
249- unsafe {
250- let mut displacement = 0u32 ;
251- self (
252- process,
253- frame_address,
254- inline_context,
255- 0 ,
256- & mut displacement,
257- line,
258- )
259- }
260- }
261- }
0 commit comments