DisassemblyWidget.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2020, Luke Wilde <lukew@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "DisassemblyWidget.h"
  7. #include "DisassemblyModel.h"
  8. #include <LibGUI/BoxLayout.h>
  9. #include <LibGUI/Painter.h>
  10. #include <LibGfx/Palette.h>
  11. namespace HackStudio {
  12. void UnavailableDisassemblyWidget::paint_event(GUI::PaintEvent& event)
  13. {
  14. Frame::paint_event(event);
  15. if (reason().is_empty())
  16. return;
  17. GUI::Painter painter(*this);
  18. painter.add_clip_rect(event.rect());
  19. painter.draw_text(frame_inner_rect(), reason(), Gfx::TextAlignment::Center, palette().window_text(), Gfx::TextElision::Right);
  20. }
  21. DisassemblyWidget::DisassemblyWidget()
  22. {
  23. set_layout<GUI::VerticalBoxLayout>();
  24. m_top_container = add<GUI::Widget>();
  25. m_top_container->set_layout<GUI::HorizontalBoxLayout>();
  26. m_top_container->set_fixed_height(20);
  27. m_function_name_label = m_top_container->add<GUI::Label>();
  28. m_disassembly_view = add<GUI::TableView>();
  29. m_unavailable_disassembly_widget = add<UnavailableDisassemblyWidget>("");
  30. hide_disassembly("Program isn't running");
  31. }
  32. void DisassemblyWidget::update_state(Debug::DebugSession const& debug_session, PtraceRegisters const& regs)
  33. {
  34. m_disassembly_view->set_model(DisassemblyModel::create(debug_session, regs));
  35. if (m_disassembly_view->model()->row_count() > 0) {
  36. auto lib = debug_session.library_at(regs.ip());
  37. if (!lib)
  38. return;
  39. auto containing_function = lib->debug_info->get_containing_function(regs.ip() - lib->base_address);
  40. if (containing_function.has_value())
  41. m_function_name_label->set_text(String::from_deprecated_string(containing_function.value().name).release_value_but_fixme_should_propagate_errors());
  42. else
  43. m_function_name_label->set_text("<missing>"_string.release_value_but_fixme_should_propagate_errors());
  44. show_disassembly();
  45. } else {
  46. hide_disassembly("No disassembly to show for this function");
  47. }
  48. }
  49. void DisassemblyWidget::program_stopped()
  50. {
  51. m_disassembly_view->set_model({});
  52. m_function_name_label->set_text({});
  53. hide_disassembly("Program isn't running");
  54. }
  55. void DisassemblyWidget::show_disassembly()
  56. {
  57. m_top_container->set_visible(true);
  58. m_disassembly_view->set_visible(true);
  59. m_function_name_label->set_visible(true);
  60. m_unavailable_disassembly_widget->set_visible(false);
  61. }
  62. void DisassemblyWidget::hide_disassembly(DeprecatedString const& reason)
  63. {
  64. m_top_container->set_visible(false);
  65. m_disassembly_view->set_visible(false);
  66. m_function_name_label->set_visible(false);
  67. m_unavailable_disassembly_widget->set_visible(true);
  68. m_unavailable_disassembly_widget->set_reason(reason);
  69. }
  70. }