forked from Imagelibrary/binutils-gdb
'struct expression *' -> gdb::unique_xmalloc_ptr<expression>
This patch makes parse_expression and friends return a unique_ptr
instead of raw pointer [1]:
typedef gdb::unique_malloc_ptr<expression> expression_up;
and then adjusts the codebase throughout to stop using cleanups to
manage lifetime of expression pointers.
Whenever I found a structure owning an expression pointer, I made it
store a unique_ptr instead of a raw pointer, which then requires using
new/delete of the holding structure, instead of XNEW/xfree.
[1] - I'd like to set the rule that types named with an "_up" suffix
are unique_ptr typedefs.
Note I used gdb::unique_xmalloc_ptr instead of gdb::unique_ptr, simply
because we still use xmalloc instead of new to allocate expression
objects. Once that's changed, all we need to do is change the
expression_up typedef and the smart pointer will then call delete
instead of xfree.
gdb/ChangeLog:
2016-11-08 Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_read_renaming_var_value): Use expression_up.
(struct ada_catchpoint_location) <excep_cond_expr>: Now an
expression_up.
(ada_catchpoint_location_dtor): Reset excep_cond_expr instead of
using xfree.
(create_excep_cond_exprs): Use expression_up and gdb::move.
(allocate_location_exception): Use new instead of XNEW.
(should_stop_exception): Likewise. Adjust to use expression_up.
(create_ada_exception_catchpoint): Use new instead of XNEW.
* ax-gdb.c (agent_eval_command_one): Use expression_up instead of
cleanups.
(maint_agent_printf_command): Use expression_up.
* break-catch-sig.c (create_signal_catchpoint): Use new instead of
XNEW.
* break-catch-syscall.c (create_syscall_event_catchpoint):
Likewise.
* break-catch-throw.c (handle_gnu_v3_exceptions): Use new instead
of XCNEW. Use gdb::unique_ptr instead of cleanups.
* breakpoint.c (set_breakpoint_condition, update_watchpoint)
(parse_cmd_to_aexpr, watchpoint_check)
(bpstat_check_breakpoint_conditions, watchpoint_locations_match):
Adjust to use expression_up.
(init_bp_location): Adjust.
(free_bp_location): Use delete instead of xfree.
(set_raw_breakpoint_without_location, set_raw_breakpoint)
(add_solib_catchpoint, create_fork_vfork_event_catchpoint)
(new_single_step_breakpoint, create_breakpoint_sal): Use new
instead of XNEW.
(find_condition_and_thread): Adjust to use expression_up.
(create_breakpoint): Use new instead of XNEW.
(dtor_watchpoint): Don't xfree expression pointers, they're
unique_ptr's now.
(insert_watchpoint, remove_watchpoint): Adjust.
(watch_command_1): Use expression_up. Use new instead of XCNEW.
(catch_exec_command_1): Use new instead of XNEW.
(bp_location_dtor): Don't xfree expression pointers, they're
unique_ptr's now.
(base_breakpoint_allocate_location)
(strace_marker_create_breakpoints_sal): Use new instead of XNEW.
(delete_breakpoint): Use delete instead of xfree.
* breakpoint.h (struct bp_location) <cond>: Now an
unique_ptr<expression> instead of a raw pointer.
(struct watchpoint) <exp, cond_exp>: Likewise.
* cli/cli-script.c (execute_control_command): Use expression_up
instead of cleanups.
* dtrace-probe.c (dtrace_process_dof_probe): Use expression_up.
* eval.c (parse_and_eval_address, parse_and_eval_long)
(parse_and_eval, parse_to_comma_and_eval, parse_and_eval_type):
Use expression_up instead of cleanups.
* expression.h (expression_up): New typedef.
(parse_expression, parse_expression_with_language, parse_exp_1):
Change return type to expression_up.
* mi/mi-main.c (mi_cmd_data_evaluate_expression)
(print_variable_or_computed): Use expression_up.
* objc-lang.c (print_object_command): Use expression_up instead of
cleanups.
* parse.c (parse_exp_1, parse_exp_in_context)
(parse_exp_in_context_1, parse_expression)
(parse_expression_with_language): Return an expression_up instead
of a raw pointer.
(parse_expression_for_completion): Use expression_up.
* printcmd.c (struct display) <exp>: Now an expression_up instead
of a raw pointer.
(print_command_1, output_command_const, set_command, x_command):
Use expression_up instead of cleanups.
(display_command): Likewise. Use new instead of XNEW.
(free_display): Use delete instead of xfree.
(do_one_display): Adjust to use expression_up.
* remote.c (remote_download_tracepoint): Likewise.
* stack.c (return_command): Likewise.
* tracepoint.c (validate_actionline, encode_actions_1): Use
expression_up instead of cleanups.
* typeprint.c (whatis_exp, maintenance_print_type): Likewise.
* value.c (init_if_undefined_command): Likewise.
* varobj.c (struct varobj_root) <exp>: Now an expression_up
instead of a raw pointer.
(varobj_create): Adjust.
(varobj_set_value): Use an expression_up instead of cleanups.
(new_root_variable): Use new instead of XNEW.
(free_variable): Use delete instead of xfree.
(value_of_root_1): Use std::swap.
This commit is contained in:
@@ -119,7 +119,7 @@ struct display
|
||||
char *exp_string;
|
||||
|
||||
/* Expression to be evaluated and displayed. */
|
||||
struct expression *exp;
|
||||
expression_up exp;
|
||||
|
||||
/* Item number of this auto-display item. */
|
||||
int number;
|
||||
@@ -1243,8 +1243,6 @@ print_value (struct value *val, const struct format_data *fmtp)
|
||||
static void
|
||||
print_command_1 (const char *exp, int voidprint)
|
||||
{
|
||||
struct expression *expr;
|
||||
struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
|
||||
struct value *val;
|
||||
struct format_data fmt;
|
||||
|
||||
@@ -1252,9 +1250,8 @@ print_command_1 (const char *exp, int voidprint)
|
||||
|
||||
if (exp && *exp)
|
||||
{
|
||||
expr = parse_expression (exp);
|
||||
make_cleanup (free_current_contents, &expr);
|
||||
val = evaluate_expression (expr);
|
||||
expression_up expr = parse_expression (exp);
|
||||
val = evaluate_expression (expr.get ());
|
||||
}
|
||||
else
|
||||
val = access_value_history (0);
|
||||
@@ -1262,8 +1259,6 @@ print_command_1 (const char *exp, int voidprint)
|
||||
if (voidprint || (val && value_type (val) &&
|
||||
TYPE_CODE (value_type (val)) != TYPE_CODE_VOID))
|
||||
print_value (val, &fmt);
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1292,8 +1287,6 @@ output_command (char *exp, int from_tty)
|
||||
void
|
||||
output_command_const (const char *exp, int from_tty)
|
||||
{
|
||||
struct expression *expr;
|
||||
struct cleanup *old_chain;
|
||||
char format = 0;
|
||||
struct value *val;
|
||||
struct format_data fmt;
|
||||
@@ -1310,10 +1303,9 @@ output_command_const (const char *exp, int from_tty)
|
||||
format = fmt.format;
|
||||
}
|
||||
|
||||
expr = parse_expression (exp);
|
||||
old_chain = make_cleanup (free_current_contents, &expr);
|
||||
expression_up expr = parse_expression (exp);
|
||||
|
||||
val = evaluate_expression (expr);
|
||||
val = evaluate_expression (expr.get ());
|
||||
|
||||
annotate_value_begin (value_type (val));
|
||||
|
||||
@@ -1325,16 +1317,12 @@ output_command_const (const char *exp, int from_tty)
|
||||
|
||||
wrap_here ("");
|
||||
gdb_flush (gdb_stdout);
|
||||
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
static void
|
||||
set_command (char *exp, int from_tty)
|
||||
{
|
||||
struct expression *expr = parse_expression (exp);
|
||||
struct cleanup *old_chain =
|
||||
make_cleanup (free_current_contents, &expr);
|
||||
expression_up expr = parse_expression (exp);
|
||||
|
||||
if (expr->nelts >= 1)
|
||||
switch (expr->elts[0].opcode)
|
||||
@@ -1352,8 +1340,7 @@ set_command (char *exp, int from_tty)
|
||||
(_("Expression is not an assignment (and might have no effect)"));
|
||||
}
|
||||
|
||||
evaluate_expression (expr);
|
||||
do_cleanups (old_chain);
|
||||
evaluate_expression (expr.get ());
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1676,7 +1663,6 @@ address_info (char *exp, int from_tty)
|
||||
static void
|
||||
x_command (char *exp, int from_tty)
|
||||
{
|
||||
struct expression *expr;
|
||||
struct format_data fmt;
|
||||
struct cleanup *old_chain;
|
||||
struct value *val;
|
||||
@@ -1698,14 +1684,13 @@ x_command (char *exp, int from_tty)
|
||||
|
||||
if (exp != 0 && *exp != 0)
|
||||
{
|
||||
expr = parse_expression (exp);
|
||||
expression_up expr = parse_expression (exp);
|
||||
/* Cause expression not to be there any more if this command is
|
||||
repeated with Newline. But don't clobber a user-defined
|
||||
command's definition. */
|
||||
if (from_tty)
|
||||
*exp = 0;
|
||||
old_chain = make_cleanup (free_current_contents, &expr);
|
||||
val = evaluate_expression (expr);
|
||||
val = evaluate_expression (expr.get ());
|
||||
if (TYPE_CODE (value_type (val)) == TYPE_CODE_REF)
|
||||
val = coerce_ref (val);
|
||||
/* In rvalue contexts, such as this, functions are coerced into
|
||||
@@ -1718,7 +1703,6 @@ x_command (char *exp, int from_tty)
|
||||
next_address = value_as_address (val);
|
||||
|
||||
next_gdbarch = expr->gdbarch;
|
||||
do_cleanups (old_chain);
|
||||
}
|
||||
|
||||
if (!next_gdbarch)
|
||||
@@ -1764,7 +1748,6 @@ static void
|
||||
display_command (char *arg, int from_tty)
|
||||
{
|
||||
struct format_data fmt;
|
||||
struct expression *expr;
|
||||
struct display *newobj;
|
||||
const char *exp = arg;
|
||||
|
||||
@@ -1792,12 +1775,12 @@ display_command (char *arg, int from_tty)
|
||||
}
|
||||
|
||||
innermost_block = NULL;
|
||||
expr = parse_expression (exp);
|
||||
expression_up expr = parse_expression (exp);
|
||||
|
||||
newobj = XNEW (struct display);
|
||||
newobj = new display ();
|
||||
|
||||
newobj->exp_string = xstrdup (exp);
|
||||
newobj->exp = expr;
|
||||
newobj->exp = gdb::move (expr);
|
||||
newobj->block = innermost_block;
|
||||
newobj->pspace = current_program_space;
|
||||
newobj->number = ++display_number;
|
||||
@@ -1826,8 +1809,7 @@ static void
|
||||
free_display (struct display *d)
|
||||
{
|
||||
xfree (d->exp_string);
|
||||
xfree (d->exp);
|
||||
xfree (d);
|
||||
delete d;
|
||||
}
|
||||
|
||||
/* Clear out the display_chain. Done when new symtabs are loaded,
|
||||
@@ -1951,8 +1933,7 @@ do_one_display (struct display *d)
|
||||
expression if the current architecture has changed. */
|
||||
if (d->exp != NULL && d->exp->gdbarch != get_current_arch ())
|
||||
{
|
||||
xfree (d->exp);
|
||||
d->exp = NULL;
|
||||
d->exp.reset ();
|
||||
d->block = NULL;
|
||||
}
|
||||
|
||||
@@ -2025,7 +2006,7 @@ do_one_display (struct display *d)
|
||||
struct value *val;
|
||||
CORE_ADDR addr;
|
||||
|
||||
val = evaluate_expression (d->exp);
|
||||
val = evaluate_expression (d->exp.get ());
|
||||
addr = value_as_address (val);
|
||||
if (d->format.format == 'i')
|
||||
addr = gdbarch_addr_bits_remove (d->exp->gdbarch, addr);
|
||||
@@ -2062,7 +2043,7 @@ do_one_display (struct display *d)
|
||||
{
|
||||
struct value *val;
|
||||
|
||||
val = evaluate_expression (d->exp);
|
||||
val = evaluate_expression (d->exp.get ());
|
||||
print_formatted (val, d->format.size, &opts, gdb_stdout);
|
||||
}
|
||||
CATCH (ex, RETURN_MASK_ERROR)
|
||||
@@ -2222,10 +2203,9 @@ clear_dangling_display_expressions (struct objfile *objfile)
|
||||
continue;
|
||||
|
||||
if (lookup_objfile_from_block (d->block) == objfile
|
||||
|| (d->exp && exp_uses_objfile (d->exp, objfile)))
|
||||
|| (d->exp != NULL && exp_uses_objfile (d->exp.get (), objfile)))
|
||||
{
|
||||
xfree (d->exp);
|
||||
d->exp = NULL;
|
||||
d->exp.reset ();
|
||||
d->block = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user