Skip to content

Commit e865f3d

Browse files
committed
Fix symbol mapping mismatched match %
We have specific diff logic that relies on knowing which object is the target object, and which is the base. generate_mapping_symbols was designed in such a way that it would reverse the target/base, leading to a match percent shown that's different when it gets applied. Fixes #200
1 parent 2b13e98 commit e865f3d

File tree

1 file changed

+51
-28
lines changed

1 file changed

+51
-28
lines changed

objdiff-core/src/diff/mod.rs

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,25 @@ pub fn diff_objs(
341341
if let (Some((right_obj, right_out)), Some((left_obj, left_out))) =
342342
(right.as_mut(), left.as_mut())
343343
{
344-
if let Some(right_name) = &mapping_config.selecting_left {
345-
generate_mapping_symbols(right_obj, right_name, left_obj, left_out, diff_config)?;
344+
if let Some(right_name) = mapping_config.selecting_left.as_deref() {
345+
generate_mapping_symbols(
346+
left_obj,
347+
left_out,
348+
right_obj,
349+
right_out,
350+
MappingSymbol::Right(right_name),
351+
diff_config,
352+
)?;
346353
}
347-
if let Some(left_name) = &mapping_config.selecting_right {
348-
generate_mapping_symbols(left_obj, left_name, right_obj, right_out, diff_config)?;
354+
if let Some(left_name) = mapping_config.selecting_right.as_deref() {
355+
generate_mapping_symbols(
356+
left_obj,
357+
left_out,
358+
right_obj,
359+
right_out,
360+
MappingSymbol::Left(left_name),
361+
diff_config,
362+
)?;
349363
}
350364
}
351365

@@ -356,16 +370,27 @@ pub fn diff_objs(
356370
})
357371
}
358372

373+
#[derive(Clone, Copy)]
374+
enum MappingSymbol<'a> {
375+
Left(&'a str),
376+
Right(&'a str),
377+
}
378+
359379
/// When we're selecting a symbol to use as a comparison, we'll create comparisons for all
360380
/// symbols in the other object that match the selected symbol's section and kind. This allows
361381
/// us to display match percentages for all symbols in the other object that could be selected.
362382
fn generate_mapping_symbols(
363-
base_obj: &Object,
364-
base_name: &str,
365-
target_obj: &Object,
366-
target_out: &mut ObjectDiff,
383+
left_obj: &Object,
384+
left_out: &mut ObjectDiff,
385+
right_obj: &Object,
386+
right_out: &mut ObjectDiff,
387+
mapping_symbol: MappingSymbol,
367388
config: &DiffObjConfig,
368389
) -> Result<()> {
390+
let (base_obj, base_name, target_obj) = match mapping_symbol {
391+
MappingSymbol::Left(name) => (left_obj, name, right_obj),
392+
MappingSymbol::Right(name) => (right_obj, name, left_obj),
393+
};
369394
let Some(base_symbol_ref) = symbol_ref_by_name(base_obj, base_name) else {
370395
return Ok(());
371396
};
@@ -377,32 +402,30 @@ fn generate_mapping_symbols(
377402
{
378403
continue;
379404
}
380-
match base_section_kind {
405+
let (left_symbol_idx, right_symbol_idx) = match mapping_symbol {
406+
MappingSymbol::Left(_) => (base_symbol_ref, target_symbol_index),
407+
MappingSymbol::Right(_) => (target_symbol_index, base_symbol_ref),
408+
};
409+
let (left_diff, right_diff) = match base_section_kind {
381410
SectionKind::Code => {
382-
let (left_diff, _right_diff) =
383-
diff_code(target_obj, base_obj, target_symbol_index, base_symbol_ref, config)?;
384-
target_out.mapping_symbols.push(MappingSymbolDiff {
385-
symbol_index: target_symbol_index,
386-
symbol_diff: left_diff,
387-
});
411+
diff_code(left_obj, right_obj, left_symbol_idx, right_symbol_idx, config)
388412
}
389413
SectionKind::Data => {
390-
let (left_diff, _right_diff) =
391-
diff_data_symbol(target_obj, base_obj, target_symbol_index, base_symbol_ref)?;
392-
target_out.mapping_symbols.push(MappingSymbolDiff {
393-
symbol_index: target_symbol_index,
394-
symbol_diff: left_diff,
395-
});
414+
diff_data_symbol(left_obj, right_obj, left_symbol_idx, right_symbol_idx)
396415
}
397416
SectionKind::Bss | SectionKind::Common => {
398-
let (left_diff, _right_diff) =
399-
diff_bss_symbol(target_obj, base_obj, target_symbol_index, base_symbol_ref)?;
400-
target_out.mapping_symbols.push(MappingSymbolDiff {
401-
symbol_index: target_symbol_index,
402-
symbol_diff: left_diff,
403-
});
417+
diff_bss_symbol(left_obj, right_obj, left_symbol_idx, right_symbol_idx)
404418
}
405-
SectionKind::Unknown => {}
419+
SectionKind::Unknown => continue,
420+
}?;
421+
match mapping_symbol {
422+
MappingSymbol::Left(_) => right_out.mapping_symbols.push(MappingSymbolDiff {
423+
symbol_index: right_symbol_idx,
424+
symbol_diff: right_diff,
425+
}),
426+
MappingSymbol::Right(_) => left_out
427+
.mapping_symbols
428+
.push(MappingSymbolDiff { symbol_index: left_symbol_idx, symbol_diff: left_diff }),
406429
}
407430
}
408431
Ok(())

0 commit comments

Comments
 (0)