Remove manual lifetime management from cli_interp

cli_interp manually manages its cli_out object.  This patch changes it
to use a unique_ptr, and also changes cli_uiout to be a private
member.
This commit is contained in:
Tom Tromey
2022-06-24 09:39:47 -06:00
parent 66fd2c678e
commit 083aca0c83

View File

@ -43,7 +43,7 @@ class cli_interp final : public cli_interp_base
{ {
public: public:
explicit cli_interp (const char *name); explicit cli_interp (const char *name);
~cli_interp (); ~cli_interp () = default;
void init (bool top_level) override; void init (bool top_level) override;
void resume () override; void resume () override;
@ -51,20 +51,16 @@ class cli_interp final : public cli_interp_base
gdb_exception exec (const char *command_str) override; gdb_exception exec (const char *command_str) override;
ui_out *interp_ui_out () override; ui_out *interp_ui_out () override;
private:
/* The ui_out for the console interpreter. */ /* The ui_out for the console interpreter. */
cli_ui_out *cli_uiout; std::unique_ptr<cli_ui_out> m_cli_uiout;
}; };
cli_interp::cli_interp (const char *name) cli_interp::cli_interp (const char *name)
: cli_interp_base (name) : cli_interp_base (name),
m_cli_uiout (new cli_ui_out (gdb_stdout))
{ {
/* Create a default uiout builder for the CLI. */
this->cli_uiout = new cli_ui_out (gdb_stdout);
}
cli_interp::~cli_interp ()
{
delete cli_uiout;
} }
/* Suppress notification struct. */ /* Suppress notification struct. */
@ -289,7 +285,6 @@ void
cli_interp::resume () cli_interp::resume ()
{ {
struct ui *ui = current_ui; struct ui *ui = current_ui;
struct cli_interp *cli = this;
struct ui_file *stream; struct ui_file *stream;
/*sync_execution = 1; */ /*sync_execution = 1; */
@ -298,10 +293,10 @@ cli_interp::resume ()
previously writing to gdb_stdout, then set it to the new previously writing to gdb_stdout, then set it to the new
gdb_stdout afterwards. */ gdb_stdout afterwards. */
stream = cli->cli_uiout->set_stream (gdb_stdout); stream = m_cli_uiout->set_stream (gdb_stdout);
if (stream != gdb_stdout) if (stream != gdb_stdout)
{ {
cli->cli_uiout->set_stream (stream); m_cli_uiout->set_stream (stream);
stream = NULL; stream = NULL;
} }
@ -310,7 +305,7 @@ cli_interp::resume ()
ui->input_handler = command_line_handler; ui->input_handler = command_line_handler;
if (stream != NULL) if (stream != NULL)
cli->cli_uiout->set_stream (gdb_stdout); m_cli_uiout->set_stream (gdb_stdout);
} }
void void
@ -322,20 +317,19 @@ cli_interp::suspend ()
gdb_exception gdb_exception
cli_interp::exec (const char *command_str) cli_interp::exec (const char *command_str)
{ {
struct cli_interp *cli = this;
struct ui_file *old_stream; struct ui_file *old_stream;
struct gdb_exception result; struct gdb_exception result;
/* gdb_stdout could change between the time cli_uiout was /* gdb_stdout could change between the time m_cli_uiout was
initialized and now. Since we're probably using a different initialized and now. Since we're probably using a different
interpreter which has a new ui_file for gdb_stdout, use that one interpreter which has a new ui_file for gdb_stdout, use that one
instead of the default. instead of the default.
It is important that it gets reset everytime, since the user It is important that it gets reset everytime, since the user
could set gdb to use a different interpreter. */ could set gdb to use a different interpreter. */
old_stream = cli->cli_uiout->set_stream (gdb_stdout); old_stream = m_cli_uiout->set_stream (gdb_stdout);
result = safe_execute_command (cli->cli_uiout, command_str, 1); result = safe_execute_command (m_cli_uiout.get (), command_str, 1);
cli->cli_uiout->set_stream (old_stream); m_cli_uiout->set_stream (old_stream);
return result; return result;
} }
@ -373,9 +367,7 @@ safe_execute_command (struct ui_out *command_uiout, const char *command,
ui_out * ui_out *
cli_interp::interp_ui_out () cli_interp::interp_ui_out ()
{ {
struct cli_interp *cli = (struct cli_interp *) this; return m_cli_uiout.get ();
return cli->cli_uiout;
} }
/* These hold the pushed copies of the gdb output files. /* These hold the pushed copies of the gdb output files.