binutils-gdb/gdb/gdbcmd.h
Tom de Vries 84a6adfd4c [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.
2021-10-09 18:58:30 +02:00

69 lines
2.7 KiB
C++

/* ***DEPRECATED*** The gdblib files must not be calling/using things in any
of the possible command languages. If necessary, a hook (that may be
present or not) must be used and set to the appropriate routine by any
command language that cares about it. If you are having to include this
file you are possibly doing things the old way. This file will dissapear.
fnasser@redhat.com */
/* Header file for GDB-specific command-line stuff.
Copyright (C) 1986-2021 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#if !defined (GDBCMD_H)
#define GDBCMD_H 1
#include "command.h"
#include "ui-out.h"
#include "cli/cli-script.h"
#include "cli/cli-cmds.h"
extern void execute_command (const char *, int);
/* Run FN. Sends its output to FILE, do not display it to the screen.
The global BATCH_FLAG will be temporarily set to true. */
extern void execute_fn_to_ui_file (struct ui_file *file, std::function<void(void)> fn);
/* Run FN. Capture its output into the returned string, do not display it
to the screen. The global BATCH_FLAG will temporarily be set to true.
When TERM_OUT is true the output is collected with terminal behaviour
(e.g. with styling). When TERM_OUT is false raw output will be collected
(e.g. no styling). */
extern void execute_fn_to_string (std::string &res,
std::function<void(void)> fn, bool term_out);
/* As execute_fn_to_ui_file, but run execute_command for P and FROM_TTY. */
extern void execute_command_to_ui_file (struct ui_file *file,
const char *p, int from_tty);
/* As execute_fn_to_string, but run execute_command for P and FROM_TTY. */
extern void execute_command_to_string (std::string &res, const char *p,
int from_tty, bool term_out);
/* As execute_command_to_string, but ignore resulting string. */
extern void execute_command_to_string (const char *p,
int from_tty, bool term_out);
extern void print_command_line (struct command_line *, unsigned int,
struct ui_file *);
extern void print_command_lines (struct ui_out *,
struct command_line *, unsigned int);
#endif /* !defined (GDBCMD_H) */