diff options
author | Tom de Vries <tdevries@suse.de> | 2021-10-09 18:58:30 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2021-10-09 18:58:30 +0200 |
commit | 84a6adfd4c7bc9e99a270b8a111da7218a0e89a5 (patch) | |
tree | 2c9335466ee4a93d7d2b907a4e6f3f1a8fecd2af /gdb/top.c | |
parent | fa9ce2c143ce7ee6bc4f22a0577fe5c0858beddd (diff) | |
download | fsf-binutils-gdb-84a6adfd4c7bc9e99a270b8a111da7218a0e89a5.zip fsf-binutils-gdb-84a6adfd4c7bc9e99a270b8a111da7218a0e89a5.tar.gz fsf-binutils-gdb-84a6adfd4c7bc9e99a270b8a111da7218a0e89a5.tar.bz2 |
[gdb] Make execute_command_to_string return string on throw
The pattern for using execute_command_to_string is:
...
std::string output;
output = execute_fn_to_string (fn, term_out);
...
This results in a problem when using it in a try/catch:
...
try
{
output = execute_fn_to_string (fn, term_out)
}
catch (const gdb_exception &e)
{
/* Use output. */
}
...
If an expection was thrown during execute_fn_to_string, then the output
remains unassigned, while it could be worthwhile to known what output was
generated by gdb before the expection was thrown.
Fix this by returning the string using a parameter instead:
...
execute_fn_to_string (output, fn, term_out)
...
Also add a variant without string parameter, to support places where the
function is used while ignoring the result:
...
execute_fn_to_string (fn, term_out)
...
Tested on x86_64-linux.
Diffstat (limited to 'gdb/top.c')
-rw-r--r-- | gdb/top.c | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -724,13 +724,25 @@ execute_fn_to_ui_file (struct ui_file *file, std::function<void(void)> fn) /* See gdbcmd.h. */ -std::string -execute_fn_to_string (std::function<void(void)> fn, bool term_out) +void +execute_fn_to_string (std::string &res, std::function<void(void)> fn, + bool term_out) { string_file str_file (term_out); - execute_fn_to_ui_file (&str_file, fn); - return std::move (str_file.string ()); + try + { + execute_fn_to_ui_file (&str_file, fn); + } + catch (...) + { + /* Finally. */ + res = std::move (str_file.string ()); + throw; + } + + /* And finally. */ + res = std::move (str_file.string ()); } /* See gdbcmd.h. */ @@ -744,12 +756,23 @@ execute_command_to_ui_file (struct ui_file *file, /* See gdbcmd.h. */ -std::string +void +execute_command_to_string (std::string &res, const char *p, int from_tty, + bool term_out) +{ + execute_fn_to_string (res, [=]() { execute_command (p, from_tty); }, + term_out); +} + +/* See gdbcmd.h. */ + +void execute_command_to_string (const char *p, int from_tty, bool term_out) { - return - execute_fn_to_string ([=]() { execute_command (p, from_tty); }, term_out); + std::string dummy; + execute_fn_to_string (dummy, [=]() { execute_command (p, from_tty); }, + term_out); } /* When nonzero, cause dont_repeat to do nothing. This should only be |