From 247d6da94b30d5aaf5d6fa417c7aa5be6cc4341f Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 15 Aug 2025 15:06:16 -0600 Subject: [PATCH] Restore extab diff view --- objdiff-core/src/arch/mod.rs | 3 ++- objdiff-gui/src/views/extab_diff.rs | 25 +++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/objdiff-core/src/arch/mod.rs b/objdiff-core/src/arch/mod.rs index dbc4ed6..514b398 100644 --- a/objdiff-core/src/arch/mod.rs +++ b/objdiff-core/src/arch/mod.rs @@ -6,6 +6,7 @@ use alloc::{ vec::Vec, }; use core::{ + any::Any, ffi::CStr, fmt::{self, Debug}, }; @@ -305,7 +306,7 @@ impl dyn Arch { } } -pub trait Arch: Send + Sync + Debug { +pub trait Arch: Any + Debug + Send + Sync { /// Finishes arch-specific initialization that must be done after sections have been combined. fn post_init(&mut self, _sections: &[Section], _symbols: &[Symbol]) {} diff --git a/objdiff-gui/src/views/extab_diff.rs b/objdiff-gui/src/views/extab_diff.rs index f077d2b..5e710c4 100644 --- a/objdiff-gui/src/views/extab_diff.rs +++ b/objdiff-gui/src/views/extab_diff.rs @@ -1,8 +1,7 @@ +use core::any::Any; + use egui::ScrollArea; -use objdiff_core::{ - arch::ppc::ExceptionInfo, - obj::{Object, Symbol}, -}; +use objdiff_core::{arch::ppc::ExceptionInfo, obj::Object}; use crate::views::{appearance::Appearance, function_diff::FunctionDiffContext}; @@ -26,19 +25,19 @@ fn decode_extab(extab: &ExceptionInfo) -> String { text } -fn find_extab_entry<'a>(_obj: &'a Object, _symbol: &Symbol) -> Option<&'a ExceptionInfo> { - // TODO - // obj.arch.ppc().and_then(|ppc| ppc.extab_for_symbol(symbol)) - None +fn find_extab_entry(obj: &Object, symbol_index: usize) -> Option<&ExceptionInfo> { + (obj.arch.as_ref() as &dyn Any) + .downcast_ref::() + .and_then(|ppc| ppc.extab_for_symbol(symbol_index)) } fn extab_text_ui( ui: &mut egui::Ui, ctx: FunctionDiffContext<'_>, - symbol: &Symbol, + symbol_index: usize, appearance: &Appearance, ) -> Option<()> { - if let Some(extab_entry) = find_extab_entry(ctx.obj, symbol) { + if let Some(extab_entry) = find_extab_entry(ctx.obj, symbol_index) { let text = decode_extab(extab_entry); ui.colored_label(appearance.replace_color, &text); return Some(()); @@ -58,10 +57,8 @@ pub(crate) fn extab_ui( ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace); ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Extend); - if let Some(symbol) = - ctx.symbol_ref.and_then(|symbol_ref| ctx.obj.symbols.get(symbol_ref)) - { - extab_text_ui(ui, ctx, symbol, appearance); + if let Some(symbol_index) = ctx.symbol_ref { + extab_text_ui(ui, ctx, symbol_index, appearance); } }); });