|
| 1 | +use std::cmp::Ordering; |
| 2 | + |
1 | 3 | use egui::{Id, Layout, RichText, ScrollArea, TextEdit, Ui, Widget, text::LayoutJob};
|
2 | 4 | use objdiff_core::{
|
3 | 5 | build::BuildStatus,
|
4 | 6 | diff::{
|
5 | 7 | DiffObjConfig, ObjectDiff, SymbolDiff,
|
6 | 8 | data::BYTES_PER_ROW,
|
7 |
| - display::{ContextItem, HoverItem, HoverItemColor, SymbolFilter, SymbolNavigationKind, display_row}, |
| 9 | + display::{ContextItem, DiffText, HoverItem, HoverItemColor, SymbolFilter, SymbolNavigationKind, display_row}, |
8 | 10 | },
|
9 |
| - obj::{Object, Symbol}, |
| 11 | + obj::{InstructionArgValue, Object, Symbol}, |
| 12 | + util::ReallySigned, |
10 | 13 | };
|
11 | 14 | use time::format_description;
|
12 | 15 |
|
@@ -71,7 +74,27 @@ fn get_asm_text(obj: &Object, symbol_diff: &SymbolDiff, symbol_idx: usize, diff_
|
71 | 74 | for ins_row in &symbol_diff.instruction_rows {
|
72 | 75 | let mut line = String::new();
|
73 | 76 | let result = display_row(obj, symbol_idx, ins_row, diff_config, |segment| {
|
74 |
| - line.push_str(&segment.text.to_string()); |
| 77 | + let text = match segment.text { |
| 78 | + DiffText::Basic(text) => text.to_string(), |
| 79 | + DiffText::Line(num) => format!("{num} "), |
| 80 | + DiffText::Address(addr) => format!("{addr:x}:"), |
| 81 | + DiffText::Opcode(mnemonic, _op) => format!("{mnemonic} "), |
| 82 | + DiffText::Argument(arg) => match arg { |
| 83 | + InstructionArgValue::Signed(v) => format!("{:#x}", ReallySigned(v)), |
| 84 | + InstructionArgValue::Unsigned(v) => format!("{v:#x}"), |
| 85 | + InstructionArgValue::Opaque(v) => v.into_owned(), |
| 86 | + }, |
| 87 | + DiffText::BranchDest(addr) => format!("{addr:x}"), |
| 88 | + DiffText::Symbol(sym) => sym.demangled_name.as_ref().unwrap_or(&sym.name).clone(), |
| 89 | + DiffText::Addend(addend) => match addend.cmp(&0i64) { |
| 90 | + Ordering::Greater => format!("+{addend:#x}"), |
| 91 | + Ordering::Less => format!("-{:#x}", -addend), |
| 92 | + _ => String::new(), |
| 93 | + }, |
| 94 | + DiffText::Spacing(n) => " ".repeat(n), |
| 95 | + DiffText::Eol => "\n".to_string(), |
| 96 | + }; |
| 97 | + line.push_str(&text); |
75 | 98 | Ok(())
|
76 | 99 | });
|
77 | 100 |
|
|
0 commit comments