2019-04-25 Tom Tromey <tromey@adacore.com>
+ * xml-support.c (struct gdb_xml_parser) <set_error>: Take an
+ rvalue reference.
+ (gdb_xml_start_element_wrapper, gdb_xml_end_element_wrapper)
+ (gdb_xml_parser::parse): Use std::move.
+ * python/python-internal.h (gdbpy_convert_exception): Take a const
+ reference.
+ * python/py-value.c (valpy_getitem, valpy_nonzero): Use
+ std::move.
+ * python/py-utils.c (gdbpy_convert_exception): Take a const
+ reference.
+ * python/py-inferior.c (infpy_write_memory, infpy_search_memory):
+ Use std::move.
+ * python/py-breakpoint.c (bppy_set_condition, bppy_set_commands):
+ Use std::move.
+ * mi/mi-main.c (mi_print_exception): Take a const reference.
+ * main.c (handle_command_errors): Take a const reference.
+ * linespec.c (parse_linespec): Use std::move.
+ * infcall.c (run_inferior_call): Use std::move.
+ (call_function_by_hand_dummy): Use std::move.
+ * exec.c (try_open_exec_file): Use std::move.
+ * exceptions.h (exception_print, exception_fprintf)
+ (exception_print_same): Update.
+ * exceptions.c (print_exception, exception_print)
+ (exception_fprintf, exception_print_same): Change parameters to
+ const reference.
+ * event-top.c (gdb_rl_callback_read_char_wrapper): Update.
+ * common/new-op.c: Use std::move.
+ * common/common-exceptions.h (struct gdb_exception): Add move
+ constructor.
+ (struct gdb_exception_error, struct gdb_exception_quit, struct
+ gdb_quit_bad_alloc): Change constructor to move constructor.
+ (throw_exception): Change parameter to rvalue reference.
+ * common/common-exceptions.c (throw_exception): Take rvalue
+ reference.
+ * cli/cli-interp.c (safe_execute_command): Use std::move.
+ * breakpoint.c (insert_bp_location, location_to_sals): Use
+ std::move.
+
+2019-04-25 Tom Tromey <tromey@adacore.com>
+
* guile/scm-exception.c (gdbscm_scm_from_gdb_exception)
(gdbscm_throw_gdb_exception): Take a gdbscm_gdb_exception.
* guile/scm-block.c, guile/scm-breakpoint.c, guile/scm-cmd.c,
if (val)
bp_excpt = gdb_exception {RETURN_ERROR, GENERIC_ERROR};
}
- catch (const gdb_exception &e)
+ catch (gdb_exception &e)
{
- bp_excpt = e;
+ bp_excpt = std::move (e);
}
}
else
bp_excpt
= gdb_exception {RETURN_ERROR, GENERIC_ERROR};
}
- catch (const gdb_exception &e)
+ catch (gdb_exception &e)
{
- bp_excpt = e;
+ bp_excpt = std::move (e);
}
if (bp_excpt.reason != 0)
if (val)
bp_excpt = gdb_exception {RETURN_ERROR, GENERIC_ERROR};
}
- catch (const gdb_exception &e)
+ catch (gdb_exception &e)
{
- bp_excpt = e;
+ bp_excpt = std::move (e);
}
}
else
{
sals = b->ops->decode_location (b, location, search_pspace);
}
- catch (const gdb_exception_error &e)
+ catch (gdb_exception_error &e)
{
int not_found_and_ok = 0;
- exception = e;
-
/* For pending breakpoints, it's expected that parsing will
fail until the right shared library is loaded. User has
already told to create pending breakpoints and don't need
b->enable_state = bp_disabled;
throw;
}
+
+ exception = std::move (e);
}
if (exception.reason == 0 || exception.error != NOT_FOUND_ERROR)
{
execute_command (command, from_tty);
}
- catch (const gdb_exception &exception)
+ catch (gdb_exception &exception)
{
- e = exception;
+ e = std::move (exception);
}
/* FIXME: cagney/2005-01-13: This shouldn't be needed. Instead the
/* Implementation of throw_exception that uses C++ try/catch. */
void
-throw_exception (const gdb_exception &exception)
+throw_exception (gdb_exception &&exception)
{
if (exception.reason == RETURN_QUIT)
- throw gdb_exception_quit (exception);
+ throw gdb_exception_quit (std::move (exception));
else if (exception.reason == RETURN_ERROR)
- throw gdb_exception_error (exception);
+ throw gdb_exception_error (std::move (exception));
else
gdb_assert_not_reached ("invalid return reason");
}
{
}
+ /* The move constructor exists so that we can mark it "noexcept",
+ which is a good practice for any sort of exception object. */
+ explicit gdb_exception (gdb_exception &&other) noexcept = default;
+
/* The copy constructor exists so that we can mark it "noexcept",
which is a good practice for any sort of exception object. */
gdb_exception (const gdb_exception &other) noexcept
{
}
- explicit gdb_exception_error (const gdb_exception &ex) noexcept
- : gdb_exception (ex)
+ explicit gdb_exception_error (gdb_exception &&ex) noexcept
+ : gdb_exception (std::move (ex))
{
gdb_assert (ex.reason == RETURN_ERROR);
}
{
}
- explicit gdb_exception_quit (const gdb_exception &ex) noexcept
- : gdb_exception (ex)
+ explicit gdb_exception_quit (gdb_exception &&ex) noexcept
+ : gdb_exception (std::move (ex))
{
gdb_assert (ex.reason == RETURN_QUIT);
}
: public gdb_exception_quit,
public std::bad_alloc
{
- explicit gdb_quit_bad_alloc (const gdb_exception &ex) noexcept
- : gdb_exception_quit (ex),
+ explicit gdb_quit_bad_alloc (gdb_exception &&ex) noexcept
+ : gdb_exception_quit (std::move (ex)),
std::bad_alloc ()
{
}
/* Throw an exception (as described by "struct gdb_exception"),
landing in the inner most containing exception handler established
using TRY/CATCH. */
-extern void throw_exception (const gdb_exception &exception)
+extern void throw_exception (gdb_exception &&exception)
ATTRIBUTE_NORETURN;
/* Throw an exception by executing a LONG JUMP to the inner most
{
malloc_failure (sz);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- throw gdb_quit_bad_alloc (ex);
+ throw gdb_quit_bad_alloc (std::move (ex));
}
}
return p;
/* Rethrow using the normal EH mechanism. */
if (gdb_expt.reason < 0)
- throw_exception (gdb_expt);
+ throw_exception (std::move (gdb_expt));
}
/* GDB's readline callback handler. Calls the current INPUT_HANDLER,
}
static void
-print_exception (struct ui_file *file, struct gdb_exception e)
+print_exception (struct ui_file *file, const struct gdb_exception &e)
{
/* KLUGE: cagney/2005-01-13: Write the string out one line at a time
as that way the MI's behavior is preserved. */
}
void
-exception_print (struct ui_file *file, struct gdb_exception e)
+exception_print (struct ui_file *file, const struct gdb_exception &e)
{
if (e.reason < 0 && e.message != NULL)
{
}
void
-exception_fprintf (struct ui_file *file, struct gdb_exception e,
+exception_fprintf (struct ui_file *file, const struct gdb_exception &e,
const char *prefix, ...)
{
if (e.reason < 0 && e.message != NULL)
/* See exceptions.h. */
int
-exception_print_same (struct gdb_exception e1, struct gdb_exception e2)
+exception_print_same (const struct gdb_exception &e1,
+ const struct gdb_exception &e2)
{
const char *msg1 = e1.message == nullptr ? "" : e1.what ();
const char *msg2 = e2.message == nullptr ? "" : e2.what ();
/* If E is an exception, print it's error message on the specified
stream. For _fprintf, prefix the message with PREFIX... */
-extern void exception_print (struct ui_file *file, struct gdb_exception e);
-extern void exception_fprintf (struct ui_file *file, struct gdb_exception e,
+extern void exception_print (struct ui_file *file,
+ const struct gdb_exception &e);
+extern void exception_fprintf (struct ui_file *file,
+ const struct gdb_exception &e,
const char *prefix,
...) ATTRIBUTE_PRINTF (3, 4);
/* Compare two exception objects for print equality. */
-extern int exception_print_same (struct gdb_exception e1,
- struct gdb_exception e2);
+extern int exception_print_same (const struct gdb_exception &e1,
+ const struct gdb_exception &e2);
#endif
exec_file_attach will clear state. */
exec_file_attach (exec_file_host, add_flags & SYMFILE_VERBOSE);
}
- catch (const gdb_exception_error &err)
+ catch (gdb_exception_error &err)
{
if (err.message != NULL)
warning ("%s", err.what ());
- prev_err = err;
+ prev_err = std::move (err);
}
if (exec_file_host != NULL)
target supports asynchronous execution. */
wait_sync_command_done ();
}
- catch (const gdb_exception &e)
+ catch (gdb_exception &e)
{
- caught_error = e;
+ caught_error = std::move (e);
}
/* If GDB has the prompt blocked before, then ensure that it remains
e.what (), name);
case RETURN_QUIT:
default:
- throw_exception (e);
+ throw_exception (std::move (e));
}
}
= symtabs_from_filename (user_filename.get (),
PARSER_STATE (parser)->search_pspace);
}
- catch (const gdb_exception_error &ex)
+ catch (gdb_exception_error &ex)
{
- file_exception = ex;
+ file_exception = std::move (ex);
}
if (file_exception.reason >= 0)
/* The linespec didn't parse. Re-throw the file exception if
there was one. */
if (file_exception.reason < 0)
- throw_exception (file_exception);
+ throw_exception (std::move (file_exception));
/* Otherwise, the symbol is not found. */
symbol_not_found_error (PARSER_EXPLICIT (parser)->function_name,
/* Handle command errors thrown from within catch_command_errors. */
static int
-handle_command_errors (struct gdb_exception e)
+handle_command_errors (const struct gdb_exception &e)
{
if (e.reason < 0)
{
/* Print a gdb exception to the MI output stream. */
static void
-mi_print_exception (const char *token, struct gdb_exception exception)
+mi_print_exception (const char *token, const struct gdb_exception &exception)
{
struct mi_interp *mi = (struct mi_interp *) current_interpreter ();
{
set_breakpoint_condition (self_bp->bp, exp, 0);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_SET_HANDLE_EXCEPTION (except);
counted_command_line lines = read_command_lines_1 (reader, 1, nullptr);
breakpoint_set_commands (self_bp->bp, std::move (lines));
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_SET_HANDLE_EXCEPTION (except);
{
write_memory_with_notification (addr, buffer, length);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_HANDLE_EXCEPTION (except);
buffer, pattern_size,
&found_addr);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_HANDLE_EXCEPTION (except);
This sets the Python error indicator. */
void
-gdbpy_convert_exception (struct gdb_exception exception)
+gdbpy_convert_exception (const struct gdb_exception &exception)
{
PyObject *exc_class;
if (res_val)
result = value_to_value_object (res_val);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
GDB_PY_HANDLE_EXCEPTION (except);
/* All other values are True. */
nonzero = 1;
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- except = ex;
+ except = std::move (ex);
}
/* This is not documented in the Python documentation, but if this
extern PyObject *gdbpy_gdb_memory_error;
extern PyObject *gdbpy_gdberror_exc;
-extern void gdbpy_convert_exception (struct gdb_exception)
+extern void gdbpy_convert_exception (const struct gdb_exception &)
CPYCHECKER_SETS_EXCEPTION;
int get_addr_from_python (PyObject *obj, CORE_ADDR *addr)
{ m_is_xinclude = is_xinclude; }
/* A thrown error, if any. */
- void set_error (gdb_exception error)
+ void set_error (gdb_exception &&error)
{
- m_error = error;
+ m_error = std::move (error);
#ifdef HAVE_XML_STOPPARSER
XML_StopParser (m_expat_parser, XML_FALSE);
#endif
{
parser->start_element (name, attrs);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- parser->set_error (ex);
+ parser->set_error (std::move (ex));
}
}
{
parser->end_element (name);
}
- catch (const gdb_exception &ex)
+ catch (gdb_exception &ex)
{
- parser->set_error (ex);
+ parser->set_error (std::move (ex));
}
}
else
{
gdb_assert (m_error.reason < 0);
- throw_exception (m_error);
+ throw_exception (std::move (m_error));
}
if (m_last_line != 0)