@@ -69,24 +69,48 @@ where
69
69
F : FnOnce ( Option < & str > ) -> io:: Result < ( ) > ,
70
70
{
71
71
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
+ ) ,
78
102
}
79
103
}
80
104
81
105
fn resolve_symname_internal < F , R > (
82
- symbol_resolver : R ,
106
+ mut symbol_resolver : R ,
83
107
frame : Frame ,
84
108
callback : F ,
85
109
context : & BacktraceContext ,
86
110
) -> io:: Result < ( ) >
87
111
where
88
112
F : FnOnce ( Option < & str > ) -> io:: Result < ( ) > ,
89
- R : SymbolResolver ,
113
+ R : FnMut ( c :: HANDLE , u64 , c :: ULONG , * mut c :: SYMBOL_INFO ) -> c :: BOOL ,
90
114
{
91
115
unsafe {
92
116
let mut info: c:: SYMBOL_INFO = mem:: zeroed ( ) ;
96
120
// due to struct alignment.
97
121
info. SizeOfStruct = 88 ;
98
122
99
- let ret = symbol_resolver. resolve_symbol (
123
+ let ret = symbol_resolver (
100
124
context. handle ,
101
125
frame. symbol_addr as u64 ,
102
126
frame. inline_context ,
@@ -121,52 +145,6 @@ where
121
145
}
122
146
}
123
147
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
-
170
148
pub fn foreach_symbol_fileline < F > (
171
149
frame : Frame ,
172
150
callback : F ,
@@ -176,30 +154,55 @@ where
176
154
F : FnMut ( & [ u8 ] , u32 ) -> io:: Result < ( ) > ,
177
155
{
178
156
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
+ ) ,
185
188
}
186
189
}
187
190
188
191
fn foreach_symbol_fileline_iternal < F , G > (
189
- line_getter : G ,
192
+ mut line_getter : G ,
190
193
frame : Frame ,
191
194
mut callback : F ,
192
195
context : & BacktraceContext ,
193
196
) -> io:: Result < bool >
194
197
where
195
198
F : FnMut ( & [ u8 ] , u32 ) -> io:: Result < ( ) > ,
196
- G : LineGetter ,
199
+ G : FnMut ( c :: HANDLE , u64 , c :: ULONG , * mut c :: IMAGEHLP_LINE64 ) -> c :: BOOL ,
197
200
{
198
201
unsafe {
199
202
let mut line: c:: IMAGEHLP_LINE64 = mem:: zeroed ( ) ;
200
203
line. SizeOfStruct = :: mem:: size_of :: < c:: IMAGEHLP_LINE64 > ( ) as u32 ;
201
204
202
- let ret = line_getter. get_line (
205
+ let ret = line_getter (
203
206
context. handle ,
204
207
frame. exact_position as u64 ,
205
208
frame. inline_context ,
@@ -212,50 +215,3 @@ where
212
215
Ok ( false )
213
216
}
214
217
}
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