@@ -3,6 +3,7 @@ use alloc::{
3
3
rc:: { Rc , Weak } ,
4
4
str:: FromStr ,
5
5
string:: { String , ToString } ,
6
+ vec,
6
7
vec:: Vec ,
7
8
} ;
8
9
use core:: cell:: RefCell ;
@@ -153,16 +154,17 @@ impl GuestDisplay for Component {
153
154
let obj = obj_diff. 0 . as_ref ( ) ;
154
155
let obj_diff = & obj_diff. 1 ;
155
156
let symbol_idx = symbol_display. symbol as usize ;
156
- let symbol = & obj. symbols [ symbol_idx] ;
157
+ let Some ( symbol) = obj. symbols . get ( symbol_idx) else {
158
+ return SymbolDisplay { name : "<unknown>" . to_string ( ) , ..Default :: default ( ) } ;
159
+ } ;
157
160
let symbol_diff = if symbol_display. is_mapping_symbol {
158
161
obj_diff
159
162
. mapping_symbols
160
163
. iter ( )
161
164
. find ( |s| s. symbol_index == symbol_idx)
162
165
. map ( |s| & s. symbol_diff )
163
- . unwrap ( )
164
166
} else {
165
- & obj_diff. symbols [ symbol_idx]
167
+ obj_diff. symbols . get ( symbol_idx)
166
168
} ;
167
169
SymbolDisplay {
168
170
name : symbol. name . clone ( ) ,
@@ -174,10 +176,10 @@ impl GuestDisplay for Component {
174
176
flags : SymbolFlags :: from ( symbol. flags ) ,
175
177
align : symbol. align . map ( |a| a. get ( ) ) ,
176
178
virtual_address : symbol. virtual_address ,
177
- target_symbol : symbol_diff. target_symbol . map ( |s| s as u32 ) ,
178
- match_percent : symbol_diff. match_percent ,
179
- diff_score : symbol_diff. diff_score ,
180
- row_count : symbol_diff. instruction_rows . len ( ) as u32 ,
179
+ target_symbol : symbol_diff. and_then ( |sd| sd . target_symbol . map ( |s| s as u32 ) ) ,
180
+ match_percent : symbol_diff. and_then ( |sd| sd . match_percent ) ,
181
+ diff_score : symbol_diff. and_then ( |sd| sd . diff_score ) ,
182
+ row_count : symbol_diff. map_or ( 0 , |sd| sd . instruction_rows . len ( ) as u32 ) ,
181
183
}
182
184
}
183
185
@@ -187,7 +189,6 @@ impl GuestDisplay for Component {
187
189
row_index : u32 ,
188
190
diff_config : DiffConfigBorrow ,
189
191
) -> InstructionDiffRow {
190
- let mut segments = Vec :: with_capacity ( 16 ) ;
191
192
let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
192
193
let obj = obj_diff. 0 . as_ref ( ) ;
193
194
let obj_diff = & obj_diff. 1 ;
@@ -198,12 +199,15 @@ impl GuestDisplay for Component {
198
199
. iter ( )
199
200
. find ( |s| s. symbol_index == symbol_idx)
200
201
. map ( |s| & s. symbol_diff )
201
- . unwrap ( )
202
202
} else {
203
- & obj_diff. symbols [ symbol_idx]
203
+ obj_diff. symbols . get ( symbol_idx)
204
+ } ;
205
+ let Some ( row) = symbol_diff. and_then ( |sd| sd. instruction_rows . get ( row_index as usize ) )
206
+ else {
207
+ return InstructionDiffRow :: default ( ) ;
204
208
} ;
205
- let row = & symbol_diff. instruction_rows [ row_index as usize ] ;
206
209
let diff_config = diff_config. get :: < ResourceDiffConfig > ( ) . 0 . borrow ( ) ;
210
+ let mut segments = Vec :: with_capacity ( 16 ) ;
207
211
diff:: display:: display_row ( obj, symbol_idx, row, & diff_config, |segment| {
208
212
segments. push ( DiffTextSegment :: from ( segment) ) ;
209
213
Ok ( ( ) )
@@ -230,9 +234,9 @@ impl GuestDisplay for Component {
230
234
) -> Vec < HoverItem > {
231
235
let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
232
236
let obj = obj_diff. 0 . as_ref ( ) ;
233
- // TODO: colorize replaced/deleted/inserted relocations
234
- let override_color = None ;
235
- diff:: display:: symbol_hover ( obj, symbol_display. symbol as usize , 0 , override_color)
237
+ let addend = 0 ; // TODO
238
+ let override_color = None ; // TODO: colorize replaced/deleted/inserted relocations
239
+ diff:: display:: symbol_hover ( obj, symbol_display. symbol as usize , addend , override_color)
236
240
. into_iter ( )
237
241
. map ( |item| HoverItem :: from ( item) )
238
242
. collect ( )
@@ -243,7 +247,7 @@ impl GuestDisplay for Component {
243
247
symbol_display : SectionDisplaySymbol ,
244
248
row_index : u32 ,
245
249
diff_config : DiffConfigBorrow ,
246
- ) -> Result < Vec < ContextItem > , String > {
250
+ ) -> Vec < ContextItem > {
247
251
let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
248
252
let obj = obj_diff. 0 . as_ref ( ) ;
249
253
let obj_diff = & obj_diff. 1 ;
@@ -254,32 +258,43 @@ impl GuestDisplay for Component {
254
258
. iter ( )
255
259
. find ( |s| s. symbol_index == symbol_idx)
256
260
. map ( |s| & s. symbol_diff )
257
- . unwrap ( )
258
261
} else {
259
- & obj_diff. symbols [ symbol_idx]
262
+ obj_diff. symbols . get ( symbol_idx)
260
263
} ;
261
- let row = & symbol_diff. instruction_rows [ row_index as usize ] ;
262
- let Some ( ins_ref) = row. ins_ref else {
263
- return Ok ( Vec :: new ( ) ) ;
264
+ let Some ( ins_ref) = symbol_diff
265
+ . and_then ( |sd| sd. instruction_rows . get ( row_index as usize ) )
266
+ . and_then ( |row| row. ins_ref )
267
+ else {
268
+ return Vec :: new ( ) ;
264
269
} ;
265
270
let diff_config = diff_config. get :: < ResourceDiffConfig > ( ) . 0 . borrow ( ) ;
266
271
let Some ( resolved) = obj. resolve_instruction_ref ( symbol_idx, ins_ref) else {
267
- return Err ( "Failed to resolve instruction" . into ( ) ) ;
272
+ return vec ! [ ContextItem :: Copy ( ContextItemCopy {
273
+ value: "Failed to resolve instruction" . to_string( ) ,
274
+ label: Some ( "error" . to_string( ) ) ,
275
+ } ) ] ;
276
+ } ;
277
+ let ins = match obj. arch . process_instruction ( resolved, & diff_config) {
278
+ Ok ( ins) => ins,
279
+ Err ( e) => {
280
+ return vec ! [ ContextItem :: Copy ( ContextItemCopy {
281
+ value: e. to_string( ) ,
282
+ label: Some ( "error" . to_string( ) ) ,
283
+ } ) ] ;
284
+ }
268
285
} ;
269
- let ins =
270
- obj. arch . process_instruction ( resolved, & diff_config) . map_err ( |e| e. to_string ( ) ) ?;
271
- Ok ( diff:: display:: instruction_context ( obj, resolved, & ins)
286
+ diff:: display:: instruction_context ( obj, resolved, & ins)
272
287
. into_iter ( )
273
288
. map ( |item| ContextItem :: from ( item) )
274
- . collect ( ) )
289
+ . collect ( )
275
290
}
276
291
277
292
fn instruction_hover (
278
293
diff : ObjectDiffBorrow ,
279
294
symbol_display : SectionDisplaySymbol ,
280
295
row_index : u32 ,
281
296
diff_config : DiffConfigBorrow ,
282
- ) -> Result < Vec < HoverItem > , String > {
297
+ ) -> Vec < HoverItem > {
283
298
let obj_diff = diff. get :: < ResourceObjectDiff > ( ) ;
284
299
let obj = obj_diff. 0 . as_ref ( ) ;
285
300
let obj_diff = & obj_diff. 1 ;
@@ -290,24 +305,37 @@ impl GuestDisplay for Component {
290
305
. iter ( )
291
306
. find ( |s| s. symbol_index == symbol_idx)
292
307
. map ( |s| & s. symbol_diff )
293
- . unwrap ( )
294
308
} else {
295
- & obj_diff. symbols [ symbol_idx]
309
+ obj_diff. symbols . get ( symbol_idx)
296
310
} ;
297
- let row = & symbol_diff. instruction_rows [ row_index as usize ] ;
298
- let Some ( ins_ref) = row. ins_ref else {
299
- return Ok ( Vec :: new ( ) ) ;
311
+ let Some ( ins_ref) = symbol_diff
312
+ . and_then ( |sd| sd. instruction_rows . get ( row_index as usize ) )
313
+ . and_then ( |row| row. ins_ref )
314
+ else {
315
+ return Vec :: new ( ) ;
300
316
} ;
301
317
let diff_config = diff_config. get :: < ResourceDiffConfig > ( ) . 0 . borrow ( ) ;
302
318
let Some ( resolved) = obj. resolve_instruction_ref ( symbol_idx, ins_ref) else {
303
- return Err ( "Failed to resolve instruction" . into ( ) ) ;
319
+ return vec ! [ HoverItem :: Text ( HoverItemText {
320
+ label: "Error" . to_string( ) ,
321
+ value: "Failed to resolve instruction" . to_string( ) ,
322
+ color: HoverItemColor :: Delete ,
323
+ } ) ] ;
304
324
} ;
305
- let ins =
306
- obj. arch . process_instruction ( resolved, & diff_config) . map_err ( |e| e. to_string ( ) ) ?;
307
- Ok ( diff:: display:: instruction_hover ( obj, resolved, & ins)
325
+ let ins = match obj. arch . process_instruction ( resolved, & diff_config) {
326
+ Ok ( ins) => ins,
327
+ Err ( e) => {
328
+ return vec ! [ HoverItem :: Text ( HoverItemText {
329
+ label: "Error" . to_string( ) ,
330
+ value: e. to_string( ) ,
331
+ color: HoverItemColor :: Delete ,
332
+ } ) ] ;
333
+ }
334
+ } ;
335
+ diff:: display:: instruction_hover ( obj, resolved, & ins)
308
336
. into_iter ( )
309
337
. map ( |item| HoverItem :: from ( item) )
310
- . collect ( ) )
338
+ . collect ( )
311
339
}
312
340
}
313
341
@@ -536,4 +564,40 @@ impl From<diff::display::SymbolNavigationKind> for SymbolNavigationKind {
536
564
}
537
565
}
538
566
567
+ impl Default for InstructionDiffKind {
568
+ fn default ( ) -> Self { Self :: None }
569
+ }
570
+
571
+ impl Default for InstructionDiffRow {
572
+ fn default ( ) -> Self { Self { segments : Default :: default ( ) , diff_kind : Default :: default ( ) } }
573
+ }
574
+
575
+ impl Default for SymbolKind {
576
+ fn default ( ) -> Self { Self :: Unknown }
577
+ }
578
+
579
+ impl Default for SymbolFlags {
580
+ fn default ( ) -> Self { Self :: empty ( ) }
581
+ }
582
+
583
+ impl Default for SymbolDisplay {
584
+ fn default ( ) -> Self {
585
+ Self {
586
+ name : Default :: default ( ) ,
587
+ demangled_name : Default :: default ( ) ,
588
+ address : Default :: default ( ) ,
589
+ size : Default :: default ( ) ,
590
+ kind : Default :: default ( ) ,
591
+ section : Default :: default ( ) ,
592
+ flags : Default :: default ( ) ,
593
+ align : Default :: default ( ) ,
594
+ virtual_address : Default :: default ( ) ,
595
+ target_symbol : Default :: default ( ) ,
596
+ match_percent : Default :: default ( ) ,
597
+ diff_score : Default :: default ( ) ,
598
+ row_count : Default :: default ( ) ,
599
+ }
600
+ }
601
+ }
602
+
539
603
export ! ( Component ) ;
0 commit comments