mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
HackStudio: Add context option to set execution point while debugging
You can now right click in HackStudio's editor while debugging and have the option to instantly move the current execution position to the current line.
This commit is contained in:
parent
31c3382577
commit
b0145ea529
|
@ -77,6 +77,21 @@ void Debugger::on_breakpoint_change(const String& file, size_t line, BreakpointC
|
|||
}
|
||||
}
|
||||
|
||||
bool Debugger::set_execution_position(const String& file, size_t line)
|
||||
{
|
||||
auto position = create_source_position(file, line);
|
||||
auto session = Debugger::the().session();
|
||||
if (!session)
|
||||
return false;
|
||||
auto address = session->get_address_from_source_position(position.file_path, position.line_number);
|
||||
if (!address.has_value())
|
||||
return false;
|
||||
auto registers = session->get_registers();
|
||||
registers.eip = address.value().address;
|
||||
session->set_registers(registers);
|
||||
return true;
|
||||
}
|
||||
|
||||
Debug::DebugInfo::SourcePosition Debugger::create_source_position(const String& file, size_t line)
|
||||
{
|
||||
if (file.starts_with("/"))
|
||||
|
|
|
@ -34,6 +34,7 @@ public:
|
|||
static bool is_initialized();
|
||||
|
||||
void on_breakpoint_change(const String& file, size_t line, BreakpointChange change_type);
|
||||
bool set_execution_position(const String& file, size_t line);
|
||||
|
||||
void set_executable_path(const String& path) { m_executable_path = path; }
|
||||
void set_source_root(const String& source_root) { m_source_root = source_root; }
|
||||
|
|
|
@ -52,7 +52,20 @@ Editor::Editor()
|
|||
auto dialog = EvaluateExpressionDialog::construct(window());
|
||||
dialog->exec();
|
||||
});
|
||||
m_move_execution_to_line_action = GUI::Action::create("Set execution point to line", [this](auto&) {
|
||||
if (!execution_position().has_value()) {
|
||||
GUI::MessageBox::show(window(), "Program must be paused", "Error", GUI::MessageBox::Type::Error);
|
||||
return;
|
||||
}
|
||||
auto success = Debugger::the().set_execution_position(currently_open_file(), cursor().line());
|
||||
if (success) {
|
||||
set_execution_position(cursor().line());
|
||||
} else {
|
||||
GUI::MessageBox::show(window(), "Failed to set execution position", "Error", GUI::MessageBox::Type::Error);
|
||||
}
|
||||
});
|
||||
add_custom_context_menu_action(*m_evaluate_expression_action);
|
||||
add_custom_context_menu_action(*m_move_execution_to_line_action);
|
||||
}
|
||||
|
||||
Editor::~Editor()
|
||||
|
|
|
@ -104,6 +104,7 @@ private:
|
|||
bool m_hovering_clickable { false };
|
||||
bool m_autocomplete_in_focus { false };
|
||||
RefPtr<GUI::Action> m_evaluate_expression_action;
|
||||
RefPtr<GUI::Action> m_move_execution_to_line_action;
|
||||
|
||||
OwnPtr<LanguageClient> m_language_client;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue