Skip to content

Commit 177bd5e

Browse files
committed
Fix branch immediates missing diff colors
Resolves #86
1 parent e1ccee1 commit 177bd5e

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed

objdiff-cli/src/cmd/diff.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,8 +750,11 @@ impl FunctionDiffUi {
750750
base_color = COLOR_ROTATION[diff.idx % COLOR_ROTATION.len()]
751751
}
752752
}
753-
DiffText::BranchDest(addr) => {
753+
DiffText::BranchDest(addr, diff) => {
754754
label_text = format!("{addr:x}");
755+
if let Some(diff) = diff {
756+
base_color = COLOR_ROTATION[diff.idx % COLOR_ROTATION.len()]
757+
}
755758
}
756759
DiffText::Symbol(sym) => {
757760
let name = sym.demangled_name.as_ref().unwrap_or(&sym.name);

objdiff-core/src/diff/display.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub enum DiffText<'a> {
2020
/// Instruction argument
2121
Argument(&'a ObjInsArgValue, Option<&'a ObjInsArgDiff>),
2222
/// Branch destination
23-
BranchDest(u64),
23+
BranchDest(u64, Option<&'a ObjInsArgDiff>),
2424
/// Symbol name
2525
Symbol(&'a ObjSymbol),
2626
/// Number of spaces
@@ -62,20 +62,20 @@ pub fn display_diff<E>(
6262
if i == 0 {
6363
cb(DiffText::Spacing(1))?;
6464
}
65+
let diff = ins_diff.arg_diff.get(i).and_then(|o| o.as_ref());
6566
match arg {
6667
ObjInsArg::PlainText(s) => {
6768
cb(DiffText::Basic(s))?;
6869
}
6970
ObjInsArg::Arg(v) => {
70-
let diff = ins_diff.arg_diff.get(i).and_then(|o| o.as_ref());
7171
cb(DiffText::Argument(v, diff))?;
7272
}
7373
ObjInsArg::Reloc => {
7474
display_reloc_name(ins.reloc.as_ref().unwrap(), &mut cb)?;
7575
}
7676
ObjInsArg::BranchDest(dest) => {
7777
if let Some(dest) = dest.checked_sub(base_addr) {
78-
cb(DiffText::BranchDest(dest))?;
78+
cb(DiffText::BranchDest(dest, diff))?;
7979
} else {
8080
cb(DiffText::Basic("<unknown>"))?;
8181
}
@@ -107,7 +107,9 @@ impl PartialEq<DiffText<'_>> for HighlightKind {
107107
(HighlightKind::Opcode(a), DiffText::Opcode(_, b)) => a == b,
108108
(HighlightKind::Arg(a), DiffText::Argument(b, _)) => a.loose_eq(b),
109109
(HighlightKind::Symbol(a), DiffText::Symbol(b)) => a == &b.name,
110-
(HighlightKind::Address(a), DiffText::Address(b) | DiffText::BranchDest(b)) => a == b,
110+
(HighlightKind::Address(a), DiffText::Address(b) | DiffText::BranchDest(b, _)) => {
111+
a == b
112+
}
111113
_ => false,
112114
}
113115
}
@@ -123,7 +125,7 @@ impl From<DiffText<'_>> for HighlightKind {
123125
DiffText::Opcode(_, op) => HighlightKind::Opcode(op),
124126
DiffText::Argument(arg, _) => HighlightKind::Arg(arg.clone()),
125127
DiffText::Symbol(sym) => HighlightKind::Symbol(sym.name.to_string()),
126-
DiffText::Address(addr) | DiffText::BranchDest(addr) => HighlightKind::Address(addr),
128+
DiffText::Address(addr) | DiffText::BranchDest(addr, _) => HighlightKind::Address(addr),
127129
_ => HighlightKind::None,
128130
}
129131
}

objdiff-gui/src/views/function_diff.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,11 @@ fn diff_text_ui(
216216
base_color = appearance.diff_colors[diff.idx % appearance.diff_colors.len()]
217217
}
218218
}
219-
DiffText::BranchDest(addr) => {
219+
DiffText::BranchDest(addr, diff) => {
220220
label_text = format!("{addr:x}");
221+
if let Some(diff) = diff {
222+
base_color = appearance.diff_colors[diff.idx % appearance.diff_colors.len()]
223+
}
221224
}
222225
DiffText::Symbol(sym) => {
223226
let name = sym.demangled_name.as_ref().unwrap_or(&sym.name);

0 commit comments

Comments
 (0)