mirror of
https://github.com/encounter/objdiff.git
synced 2025-12-09 21:47:42 +00:00
Diff data symbols & improve symbol match logic
This commit is contained in:
@@ -282,6 +282,7 @@ fn asm_col_ui(
|
||||
ins_view_state: &mut FunctionViewState,
|
||||
) {
|
||||
let (section, symbol) = obj.0.section_symbol(symbol_ref);
|
||||
let section = section.unwrap();
|
||||
let ins_diff = &obj.1.symbol_diff(symbol_ref).instructions[row.index()];
|
||||
let response_cb = |response: Response| {
|
||||
if let Some(ins) = &ins_diff.ins {
|
||||
|
||||
@@ -7,7 +7,7 @@ use egui::{
|
||||
use egui_extras::{Size, StripBuilder};
|
||||
use objdiff_core::{
|
||||
diff::{ObjDiff, ObjSymbolDiff},
|
||||
obj::{ObjInfo, ObjSection, ObjSectionKind, ObjSymbol, ObjSymbolFlags},
|
||||
obj::{ObjInfo, ObjSection, ObjSectionKind, ObjSymbol, ObjSymbolFlags, SymbolRef},
|
||||
};
|
||||
|
||||
use crate::{
|
||||
@@ -52,7 +52,7 @@ pub struct DiffViewState {
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct SymbolViewState {
|
||||
pub highlighted_symbol: Option<String>,
|
||||
pub highlighted_symbol: (Option<SymbolRef>, Option<SymbolRef>),
|
||||
pub selected_symbol: Option<SymbolRefByName>,
|
||||
pub reverse_fn_order: bool,
|
||||
pub disable_reverse_fn_order: bool,
|
||||
@@ -184,6 +184,7 @@ fn symbol_ui(
|
||||
section: Option<&ObjSection>,
|
||||
state: &mut SymbolViewState,
|
||||
appearance: &Appearance,
|
||||
left: bool,
|
||||
) -> Option<View> {
|
||||
if symbol.flags.0.contains(ObjSymbolFlags::Hidden) && !state.show_hidden_symbols {
|
||||
return None;
|
||||
@@ -193,8 +194,10 @@ fn symbol_ui(
|
||||
let name: &str =
|
||||
if let Some(demangled) = &symbol.demangled_name { demangled } else { &symbol.name };
|
||||
let mut selected = false;
|
||||
if let Some(sym) = &state.highlighted_symbol {
|
||||
selected = sym == &symbol.name;
|
||||
if let Some(sym_ref) =
|
||||
if left { state.highlighted_symbol.0 } else { state.highlighted_symbol.1 }
|
||||
{
|
||||
selected = symbol_diff.symbol_ref == sym_ref;
|
||||
}
|
||||
write_text("[", appearance.text_color, &mut job, appearance.code_font.clone());
|
||||
if symbol.flags.0.contains(ObjSymbolFlags::Common) {
|
||||
@@ -245,7 +248,15 @@ fn symbol_ui(
|
||||
}
|
||||
}
|
||||
} else if response.hovered() {
|
||||
state.highlighted_symbol = Some(symbol.name.clone());
|
||||
state.highlighted_symbol = if let Some(diff_symbol) = symbol_diff.diff_symbol {
|
||||
if left {
|
||||
(Some(symbol_diff.symbol_ref), Some(diff_symbol))
|
||||
} else {
|
||||
(Some(diff_symbol), Some(symbol_diff.symbol_ref))
|
||||
}
|
||||
} else {
|
||||
(None, None)
|
||||
};
|
||||
}
|
||||
ret
|
||||
}
|
||||
@@ -267,6 +278,7 @@ fn symbol_list_ui(
|
||||
state: &mut SymbolViewState,
|
||||
lower_search: &str,
|
||||
appearance: &Appearance,
|
||||
left: bool,
|
||||
) -> Option<View> {
|
||||
let mut ret = None;
|
||||
ScrollArea::both().auto_shrink([false, false]).show(ui, |ui| {
|
||||
@@ -277,7 +289,15 @@ fn symbol_list_ui(
|
||||
if !obj.0.common.is_empty() {
|
||||
CollapsingHeader::new(".comm").default_open(true).show(ui, |ui| {
|
||||
for (symbol, symbol_diff) in obj.0.common.iter().zip(&obj.1.common) {
|
||||
ret = ret.or(symbol_ui(ui, symbol, symbol_diff, None, state, appearance));
|
||||
ret = ret.or(symbol_ui(
|
||||
ui,
|
||||
symbol,
|
||||
symbol_diff,
|
||||
None,
|
||||
state,
|
||||
appearance,
|
||||
left,
|
||||
));
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -301,6 +321,7 @@ fn symbol_list_ui(
|
||||
Some(section),
|
||||
state,
|
||||
appearance,
|
||||
left,
|
||||
));
|
||||
}
|
||||
} else {
|
||||
@@ -317,6 +338,7 @@ fn symbol_list_ui(
|
||||
Some(section),
|
||||
state,
|
||||
appearance,
|
||||
left,
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -447,6 +469,7 @@ pub fn symbol_diff_ui(ui: &mut Ui, state: &mut DiffViewState, appearance: &Appea
|
||||
symbol_state,
|
||||
&lower_search,
|
||||
appearance,
|
||||
true,
|
||||
));
|
||||
} else {
|
||||
missing_obj_ui(ui, appearance);
|
||||
@@ -466,6 +489,7 @@ pub fn symbol_diff_ui(ui: &mut Ui, state: &mut DiffViewState, appearance: &Appea
|
||||
symbol_state,
|
||||
&lower_search,
|
||||
appearance,
|
||||
false,
|
||||
));
|
||||
} else {
|
||||
missing_obj_ui(ui, appearance);
|
||||
|
||||
Reference in New Issue
Block a user