From 77cd03e27c547a5b5b7f086a0b537084eb399258 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 20 Apr 2023 16:07:12 -0400 Subject: [PATCH] gdb: add interp::on_user_selected_context_changed method Same as previous patches, but for user_selected_context_changed. Change-Id: I40de15be897671227d4bcf3e747f0fd595f0d5be --- gdb/cli/cli-interp.c | 36 +++++-------------------- gdb/cli/cli-interp.h | 1 + gdb/inferior.c | 4 +-- gdb/infrun.c | 8 ++++++ gdb/infrun.h | 3 +++ gdb/interps.c | 8 ++++++ gdb/interps.h | 8 ++++++ gdb/mi/mi-interp.c | 64 +++++++++++++++----------------------------- gdb/mi/mi-interp.h | 1 + gdb/mi/mi-main.c | 2 +- gdb/stack.c | 8 +++--- gdb/thread.c | 6 ++--- 12 files changed, 66 insertions(+), 83 deletions(-) diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c index ffb40729fc6..6a175f7baa1 100644 --- a/gdb/cli/cli-interp.c +++ b/gdb/cli/cli-interp.c @@ -67,15 +67,6 @@ cli_interp::cli_interp (const char *name) /* Suppress notification struct. */ struct cli_suppress_notification cli_suppress_notification; -/* Returns the INTERP's data cast as cli_interp_base if INTERP is a - console-like interpreter, and returns NULL otherwise. */ - -static cli_interp_base * -as_cli_interp_base (interp *interp) -{ - return dynamic_cast (interp); -} - /* See cli-interp.h. Breakpoint hits should always be mirrored to a console. Deciding @@ -164,10 +155,8 @@ cli_interp_base::on_command_error () display_gdb_prompt (NULL); } -/* Observer for the user_selected_context_changed notification. */ - -static void -cli_base_on_user_selected_context_changed (user_selected_what selection) +void +cli_interp_base::on_user_selected_context_changed (user_selected_what selection) { /* This event is suppressed. */ if (cli_suppress_notification.user_selected_context) @@ -175,19 +164,12 @@ cli_base_on_user_selected_context_changed (user_selected_what selection) thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr; - SWITCH_THRU_ALL_UIS () - { - cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ()); - if (cli == nullptr) - continue; - - if (selection & USER_SELECTED_INFERIOR) - print_selected_inferior (cli->interp_ui_out ()); + if (selection & USER_SELECTED_INFERIOR) + print_selected_inferior (this->interp_ui_out ()); - if (tp != nullptr - && ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))) - print_selected_thread_frame (cli->interp_ui_out (), selection); - } + if (tp != nullptr + && ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))) + print_selected_thread_frame (this->interp_ui_out (), selection); } /* pre_command_loop implementation. */ @@ -347,8 +329,4 @@ void _initialize_cli_interp () { interp_factory_register (INTERP_CONSOLE, cli_interp_factory); - - /* Note these all work for both the CLI and TUI interpreters. */ - gdb::observers::user_selected_context_changed.attach - (cli_base_on_user_selected_context_changed, "cli-interp-base"); } diff --git a/gdb/cli/cli-interp.h b/gdb/cli/cli-interp.h index 5020b2bc6ef..a1a20b67894 100644 --- a/gdb/cli/cli-interp.h +++ b/gdb/cli/cli-interp.h @@ -40,6 +40,7 @@ public: void on_no_history () override; void on_sync_execution_done () override; void on_command_error () override; + void on_user_selected_context_changed (user_selected_what selection) override; private: struct saved_output_files diff --git a/gdb/inferior.c b/gdb/inferior.c index fd451c87e70..8962b6401e3 100644 --- a/gdb/inferior.c +++ b/gdb/inferior.c @@ -745,7 +745,7 @@ inferior_command (const char *args, int from_tty) switch_to_thread (tp); } - gdb::observers::user_selected_context_changed.notify + notify_user_selected_context_changed (USER_SELECTED_INFERIOR | USER_SELECTED_THREAD | USER_SELECTED_FRAME); @@ -754,7 +754,7 @@ inferior_command (const char *args, int from_tty) { switch_to_inferior_no_thread (inf); - gdb::observers::user_selected_context_changed.notify + notify_user_selected_context_changed (USER_SELECTED_INFERIOR); } } diff --git a/gdb/infrun.c b/gdb/infrun.c index 2d234edfbcc..d4334302a99 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -6283,6 +6283,14 @@ notify_normal_stop (bpstat *bs, int print_frame) gdb::observers::normal_stop.notify (bs, print_frame); } +/* See infrun.h. */ + +void notify_user_selected_context_changed (user_selected_what selection) +{ + interps_notify_user_selected_context_changed (selection); + gdb::observers::user_selected_context_changed.notify (selection); +} + /* Come here when the program has stopped with a signal. */ static void diff --git a/gdb/infrun.h b/gdb/infrun.h index cbafc3ea440..a343d27f72d 100644 --- a/gdb/infrun.h +++ b/gdb/infrun.h @@ -218,6 +218,9 @@ extern void notify_signal_received (gdb_signal sig); normally. */ extern void notify_normal_stop (bpstat *bs, int print_frame); +/* Notify interpreters and observers that the user focus has changed. */ +extern void notify_user_selected_context_changed (user_selected_what selection); + /* Several print_*_reason helper functions to print why the inferior has stopped to the passed in UIOUT. */ diff --git a/gdb/interps.c b/gdb/interps.c index 885bfc36ec7..55abcb3c6e4 100644 --- a/gdb/interps.c +++ b/gdb/interps.c @@ -438,6 +438,14 @@ interps_notify_exited (int status) interps_notify (&interp::on_exited, status); } +/* See interps.h. */ + +void +interps_notify_user_selected_context_changed (user_selected_what selection) +{ + interps_notify (&interp::on_user_selected_context_changed, selection); +} + /* This just adds the "interpreter-exec" command. */ void _initialize_interpreter (); void diff --git a/gdb/interps.h b/gdb/interps.h index 53d951b8d63..4706c9bb63e 100644 --- a/gdb/interps.h +++ b/gdb/interps.h @@ -110,6 +110,10 @@ public: command on this interpreter. */ virtual void on_command_error () {} + /* Notify the interpreter that the user focus has changed. */ + virtual void on_user_selected_context_changed (user_selected_what selection) + {} + private: /* The memory for this is static, it comes from literal strings (e.g. "cli"). */ const char *m_name; @@ -217,6 +221,10 @@ extern void interps_notify_no_history (); status STATUS. */ extern void interps_notify_exited (int status); +/* Notify all interpreters that the user focus has changed. */ +extern void interps_notify_user_selected_context_changed + (user_selected_what selection); + /* well-known interpreters */ #define INTERP_CONSOLE "console" #define INTERP_MI2 "mi2" diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index 313d75185bc..2984cb9af11 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -1087,60 +1087,40 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr, } } -/* Emit an event when the selection context (inferior, thread, frame) - changed. */ - -static void -mi_user_selected_context_changed (user_selected_what selection) +void +mi_interp::on_user_selected_context_changed (user_selected_what selection) { - struct thread_info *tp; - /* Don't send an event if we're responding to an MI command. */ if (mi_suppress_notification.user_selected_context) return; - if (inferior_ptid != null_ptid) - tp = inferior_thread (); - else - tp = NULL; - - SWITCH_THRU_ALL_UIS () - { - struct mi_interp *mi = as_mi_interp (top_level_interpreter ()); - struct ui_out *mi_uiout; - - if (mi == NULL) - continue; + thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr; + ui_out *mi_uiout = this->interp_ui_out (); + ui_out_redirect_pop redirect_popper (mi_uiout, this->event_channel); - mi_uiout = top_level_interpreter ()->interp_ui_out (); + target_terminal::scoped_restore_terminal_state term_state; + target_terminal::ours_for_output (); - ui_out_redirect_pop redirect_popper (mi_uiout, mi->event_channel); + if (selection & USER_SELECTED_INFERIOR) + print_selected_inferior (this->cli_uiout); - target_terminal::scoped_restore_terminal_state term_state; - target_terminal::ours_for_output (); + if (tp != NULL + && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))) + { + print_selected_thread_frame (this->cli_uiout, selection); - if (selection & USER_SELECTED_INFERIOR) - print_selected_inferior (mi->cli_uiout); + gdb_printf (this->event_channel, "thread-selected,id=\"%d\"", + tp->global_num); - if (tp != NULL - && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))) + if (tp->state != THREAD_RUNNING) { - print_selected_thread_frame (mi->cli_uiout, selection); - - gdb_printf (mi->event_channel, - "thread-selected,id=\"%d\"", - tp->global_num); - - if (tp->state != THREAD_RUNNING) - { - if (has_stack_frames ()) - print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL), - 1, SRC_AND_LOC, 1); - } + if (has_stack_frames ()) + print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL), + 1, SRC_AND_LOC, 1); } - - gdb_flush (mi->event_channel); } + + gdb_flush (this->event_channel); } ui_out * @@ -1234,6 +1214,4 @@ _initialize_mi_interp () gdb::observers::command_param_changed.attach (mi_command_param_changed, "mi-interp"); gdb::observers::memory_changed.attach (mi_memory_changed, "mi-interp"); - gdb::observers::user_selected_context_changed.attach - (mi_user_selected_context_changed, "mi-interp"); } diff --git a/gdb/mi/mi-interp.h b/gdb/mi/mi-interp.h index 6a02eeff8c1..bb66e630432 100644 --- a/gdb/mi/mi-interp.h +++ b/gdb/mi/mi-interp.h @@ -49,6 +49,7 @@ public: void on_no_history () override; void on_sync_execution_done () override; void on_command_error () override; + void on_user_selected_context_changed (user_selected_what selection) override; /* MI's output channels */ mi_console_file *out; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index dc7d717ef60..7503ffd2f18 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2138,7 +2138,7 @@ mi_cmd_execute (struct mi_parse *parse) if (!parse->cmd->preserve_user_selected_context () && current_user_selected_context.has_changed ()) - gdb::observers::user_selected_context_changed.notify + interps_notify_user_selected_context_changed (USER_SELECTED_THREAD | USER_SELECTED_FRAME); } diff --git a/gdb/stack.c b/gdb/stack.c index e941eb639df..002bf580634 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -1831,7 +1831,7 @@ select_frame_command_core (frame_info_ptr fi, bool ignored) frame_info_ptr prev_frame = get_selected_frame (); select_frame (fi); if (get_selected_frame () != prev_frame) - gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME); + notify_user_selected_context_changed (USER_SELECTED_FRAME); } /* The core of all the "frame" sub-commands. Select frame FI, and if this @@ -1844,7 +1844,7 @@ frame_command_core (frame_info_ptr fi, bool ignored) frame_info_ptr prev_frame = get_selected_frame (); select_frame (fi); if (get_selected_frame () != prev_frame) - gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME); + notify_user_selected_context_changed (USER_SELECTED_FRAME); else print_selected_thread_frame (current_uiout, USER_SELECTED_FRAME); } @@ -2644,7 +2644,7 @@ static void up_command (const char *count_exp, int from_tty) { up_silently_base (count_exp); - gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME); + notify_user_selected_context_changed (USER_SELECTED_FRAME); } /* Select the frame down one or COUNT_EXP stack levels from the previously @@ -2683,7 +2683,7 @@ static void down_command (const char *count_exp, int from_tty) { down_silently_base (count_exp); - gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME); + notify_user_selected_context_changed (USER_SELECTED_FRAME); } void diff --git a/gdb/thread.c b/gdb/thread.c index e9432f945e0..13db9f8747e 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -1846,10 +1846,8 @@ thread_command (const char *tidstr, int from_tty) | USER_SELECTED_FRAME); } else - { - gdb::observers::user_selected_context_changed.notify - (USER_SELECTED_THREAD | USER_SELECTED_FRAME); - } + notify_user_selected_context_changed + (USER_SELECTED_THREAD | USER_SELECTED_FRAME); } } -- 2.30.2