From: Pedro Alves Date: Wed, 22 Jun 2022 16:03:50 +0000 (+0100) Subject: Eliminate TUI/CLI observers duplication X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5227abd299c632f66505f827cd221fe4bd7f4d0d;p=binutils-gdb.git Eliminate TUI/CLI observers duplication For historical reasons, the CLI and the TUI observers are basically exact duplicates, except for the downcast: cli: struct cli_interp *cli = as_cli_interp (interp); tui: struct interp *tui = as_tui_interp (interp); and how they get at the interpreter's ui_out: cli: cli->cli_uiout tui: tui->interp_ui_out () Since interp_ui_out() is a virtual method that also works for the CLI interpreter, and, both the CLI and the TUI interpreters inherit from the same base class (cli_interp_base), we can convert the CLI observers to cast to cli_interp_base instead and use interp_ui_out() too. With that, the CLI observers will work for the TUI interpreter as well. This lets us completely eliminate the TUI observers. That's what this commit does. Change-Id: Iaf6cf12dfa200ed3ab203a895a72b69dfedbd6e0 --- diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c index fe9e4b43f14..036bc723b24 100644 --- a/gdb/cli/cli-interp.c +++ b/gdb/cli/cli-interp.c @@ -70,13 +70,13 @@ cli_interp::~cli_interp () /* Suppress notification struct. */ struct cli_suppress_notification cli_suppress_notification; -/* Returns the INTERP's data cast as cli_interp if INTERP is a CLI, - and returns NULL otherwise. */ +/* Returns the INTERP's data cast as cli_interp_base if INTERP is a + console-like interpreter, and returns NULL otherwise. */ -static struct cli_interp * -as_cli_interp (struct interp *interp) +static cli_interp_base * +as_cli_interp_base (interp *interp) { - return dynamic_cast (interp); + return dynamic_cast (interp); } /* Longjmp-safe wrapper for "execute_command". */ @@ -117,12 +117,13 @@ should_print_stop_to_console (struct interp *console_interp, /* Observers for several run control events. If the interpreter is quiet (i.e., another interpreter is being run with - interpreter-exec), print nothing. */ + interpreter-exec), print nothing. These are named "cli_base" as + they print to both CLI interpreters and TUI interpreters. */ /* Observer for the normal_stop notification. */ static void -cli_on_normal_stop (struct bpstat *bs, int print_frame) +cli_base_on_normal_stop (struct bpstat *bs, int print_frame) { if (!print_frame) return; @@ -134,106 +135,98 @@ cli_on_normal_stop (struct bpstat *bs, int print_frame) SWITCH_THRU_ALL_UIS () { struct interp *interp = top_level_interpreter (); - struct cli_interp *cli = as_cli_interp (interp); - struct thread_info *thread; - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (interp); + if (cli == nullptr) continue; - thread = inferior_thread (); + thread_info *thread = inferior_thread (); if (should_print_stop_to_console (interp, thread)) - print_stop_event (cli->cli_uiout); + print_stop_event (cli->interp_ui_out ()); } } /* Observer for the signal_received notification. */ static void -cli_on_signal_received (enum gdb_signal siggnal) +cli_base_on_signal_received (enum gdb_signal siggnal) { SWITCH_THRU_ALL_UIS () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) continue; - print_signal_received_reason (cli->cli_uiout, siggnal); + print_signal_received_reason (cli->interp_ui_out (), siggnal); } } /* Observer for the end_stepping_range notification. */ static void -cli_on_end_stepping_range (void) +cli_base_on_end_stepping_range () { SWITCH_THRU_ALL_UIS () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) continue; - print_end_stepping_range_reason (cli->cli_uiout); + print_end_stepping_range_reason (cli->interp_ui_out ()); } } /* Observer for the signalled notification. */ static void -cli_on_signal_exited (enum gdb_signal siggnal) +cli_base_on_signal_exited (enum gdb_signal siggnal) { SWITCH_THRU_ALL_UIS () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) continue; - print_signal_exited_reason (cli->cli_uiout, siggnal); + print_signal_exited_reason (cli->interp_ui_out (), siggnal); } } /* Observer for the exited notification. */ static void -cli_on_exited (int exitstatus) +cli_base_on_exited (int exitstatus) { SWITCH_THRU_ALL_UIS () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) continue; - print_exited_reason (cli->cli_uiout, exitstatus); + print_exited_reason (cli->interp_ui_out (), exitstatus); } } /* Observer for the no_history notification. */ static void -cli_on_no_history (void) +cli_base_on_no_history () { SWITCH_THRU_ALL_UIS () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) continue; - print_no_history_reason (cli->cli_uiout); + print_no_history_reason (cli->interp_ui_out ()); } } /* Observer for the sync_execution_done notification. */ static void -cli_on_sync_execution_done (void) +cli_base_on_sync_execution_done () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) return; display_gdb_prompt (NULL); @@ -242,11 +235,10 @@ cli_on_sync_execution_done (void) /* Observer for the command_error notification. */ static void -cli_on_command_error (void) +cli_base_on_command_error () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) return; display_gdb_prompt (NULL); @@ -255,27 +247,26 @@ cli_on_command_error (void) /* Observer for the user_selected_context_changed notification. */ static void -cli_on_user_selected_context_changed (user_selected_what selection) +cli_base_on_user_selected_context_changed (user_selected_what selection) { /* This event is suppressed. */ if (cli_suppress_notification.user_selected_context) return; - thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : NULL; + thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr; SWITCH_THRU_ALL_UIS () { - struct cli_interp *cli = as_cli_interp (top_level_interpreter ()); - - if (cli == NULL) + cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); + if (cli == nullptr) continue; if (selection & USER_SELECTED_INFERIOR) - print_selected_inferior (cli->cli_uiout); + print_selected_inferior (cli->interp_ui_out ()); - if (tp != NULL + if (tp != nullptr && ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))) - print_selected_thread_frame (cli->cli_uiout, selection); + print_selected_thread_frame (cli->interp_ui_out (), selection); } } @@ -465,17 +456,21 @@ _initialize_cli_interp () { interp_factory_register (INTERP_CONSOLE, cli_interp_factory); - /* If changing this, remember to update tui-interp.c as well. */ - gdb::observers::normal_stop.attach (cli_on_normal_stop, "cli-interp"); - gdb::observers::end_stepping_range.attach (cli_on_end_stepping_range, - "cli-interp"); - gdb::observers::signal_received.attach (cli_on_signal_received, "cli-interp"); - gdb::observers::signal_exited.attach (cli_on_signal_exited, "cli-interp"); - gdb::observers::exited.attach (cli_on_exited, "cli-interp"); - gdb::observers::no_history.attach (cli_on_no_history, "cli-interp"); - gdb::observers::sync_execution_done.attach (cli_on_sync_execution_done, - "cli-interp"); - gdb::observers::command_error.attach (cli_on_command_error, "cli-interp"); + /* Note these all work for both the CLI and TUI interpreters. */ + gdb::observers::normal_stop.attach (cli_base_on_normal_stop, + "cli-interp-base"); + gdb::observers::end_stepping_range.attach (cli_base_on_end_stepping_range, + "cli-interp-base"); + gdb::observers::signal_received.attach (cli_base_on_signal_received, + "cli-interp-base"); + gdb::observers::signal_exited.attach (cli_base_on_signal_exited, + "cli-interp-base"); + gdb::observers::exited.attach (cli_base_on_exited, "cli-interp-base"); + gdb::observers::no_history.attach (cli_base_on_no_history, "cli-interp-base"); + gdb::observers::sync_execution_done.attach (cli_base_on_sync_execution_done, + "cli-interp-base"); + gdb::observers::command_error.attach (cli_base_on_command_error, + "cli-interp-base"); gdb::observers::user_selected_context_changed.attach - (cli_on_user_selected_context_changed, "cli-interp"); + (cli_base_on_user_selected_context_changed, "cli-interp-base"); } diff --git a/gdb/tui/tui-interp.c b/gdb/tui/tui-interp.c index b4faede8ce6..1c4ffbbc3aa 100644 --- a/gdb/tui/tui-interp.c +++ b/gdb/tui/tui-interp.c @@ -53,15 +53,6 @@ public: ui_out *interp_ui_out () override; }; -/* Returns the INTERP if the INTERP is a TUI, and returns NULL - otherwise. */ - -static tui_interp * -as_tui_interp (struct interp *interp) -{ - return dynamic_cast (interp); -} - /* Cleanup the tui before exiting. */ static void @@ -72,171 +63,6 @@ tui_exit (void) tui_disable (); } -/* Observers for several run control events. If the interpreter is - quiet (i.e., another interpreter is being run with - interpreter-exec), print nothing. */ - -/* Observer for the normal_stop notification. */ - -static void -tui_on_normal_stop (struct bpstat *bs, int print_frame) -{ - if (!print_frame) - return; - - /* This event is suppressed. */ - if (cli_suppress_notification.normal_stop) - return; - - SWITCH_THRU_ALL_UIS () - { - struct interp *interp = top_level_interpreter (); - struct interp *tui = as_tui_interp (interp); - struct thread_info *thread; - - if (tui == NULL) - continue; - - thread = inferior_thread (); - if (should_print_stop_to_console (interp, thread)) - print_stop_event (tui->interp_ui_out ()); - } -} - -/* Observer for the signal_received notification. */ - -static void -tui_on_signal_received (enum gdb_signal siggnal) -{ - SWITCH_THRU_ALL_UIS () - { - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - continue; - - print_signal_received_reason (tui->interp_ui_out (), siggnal); - } -} - -/* Observer for the end_stepping_range notification. */ - -static void -tui_on_end_stepping_range (void) -{ - SWITCH_THRU_ALL_UIS () - { - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - continue; - - print_end_stepping_range_reason (tui->interp_ui_out ()); - } -} - -/* Observer for the signal_exited notification. */ - -static void -tui_on_signal_exited (enum gdb_signal siggnal) -{ - SWITCH_THRU_ALL_UIS () - { - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - continue; - - print_signal_exited_reason (tui->interp_ui_out (), siggnal); - } -} - -/* Observer for the exited notification. */ - -static void -tui_on_exited (int exitstatus) -{ - SWITCH_THRU_ALL_UIS () - { - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - continue; - - print_exited_reason (tui->interp_ui_out (), exitstatus); - } -} - -/* Observer for the no_history notification. */ - -static void -tui_on_no_history (void) -{ - SWITCH_THRU_ALL_UIS () - { - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - continue; - - print_no_history_reason (tui->interp_ui_out ()); - } -} - -/* Observer for the sync_execution_done notification. */ - -static void -tui_on_sync_execution_done (void) -{ - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - return; - - display_gdb_prompt (NULL); -} - -/* Observer for the command_error notification. */ - -static void -tui_on_command_error (void) -{ - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - return; - - display_gdb_prompt (NULL); -} - -/* Observer for the user_selected_context_changed notification. */ - -static void -tui_on_user_selected_context_changed (user_selected_what selection) -{ - /* This event is suppressed. */ - if (cli_suppress_notification.user_selected_context) - return; - - thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : NULL; - - SWITCH_THRU_ALL_UIS () - { - struct interp *tui = as_tui_interp (top_level_interpreter ()); - - if (tui == NULL) - continue; - - if (selection & USER_SELECTED_INFERIOR) - print_selected_inferior (tui->interp_ui_out ()); - - if (tp != NULL - && ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))) - print_selected_thread_frame (tui->interp_ui_out (), selection); - - } -} - /* These implement the TUI interpreter. */ void @@ -349,17 +175,7 @@ _initialize_tui_interp () if (interpreter_p == INTERP_CONSOLE) interpreter_p = INTERP_TUI; - /* If changing this, remember to update cli-interp.c as well. */ - gdb::observers::normal_stop.attach (tui_on_normal_stop, "tui-interp"); - gdb::observers::signal_received.attach (tui_on_signal_received, "tui-interp"); - gdb::observers::end_stepping_range.attach (tui_on_end_stepping_range, - "tui-interp"); - gdb::observers::signal_exited.attach (tui_on_signal_exited, "tui-interp"); - gdb::observers::exited.attach (tui_on_exited, "tui-interp"); - gdb::observers::no_history.attach (tui_on_no_history, "tui-interp"); - gdb::observers::sync_execution_done.attach (tui_on_sync_execution_done, - "tui-interp"); - gdb::observers::command_error.attach (tui_on_command_error, "tui-interp"); - gdb::observers::user_selected_context_changed.attach - (tui_on_user_selected_context_changed, "tui-interp"); + /* There are no observers here because the CLI interpreter's + observers work for the TUI interpreter as well. See + cli-interp.c. */ }