mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-03 05:12:28 +08:00
'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:
@ -701,7 +701,6 @@ void
|
||||
validate_actionline (const char *line, struct breakpoint *b)
|
||||
{
|
||||
struct cmd_list_element *c;
|
||||
struct expression *exp = NULL;
|
||||
struct cleanup *old_chain = NULL;
|
||||
const char *tmp_p;
|
||||
const char *p;
|
||||
@ -755,9 +754,8 @@ validate_actionline (const char *line, struct breakpoint *b)
|
||||
for (loc = t->base.loc; loc; loc = loc->next)
|
||||
{
|
||||
p = tmp_p;
|
||||
exp = parse_exp_1 (&p, loc->address,
|
||||
block_for_pc (loc->address), 1);
|
||||
old_chain = make_cleanup (free_current_contents, &exp);
|
||||
expression_up exp = parse_exp_1 (&p, loc->address,
|
||||
block_for_pc (loc->address), 1);
|
||||
|
||||
if (exp->elts[0].opcode == OP_VAR_VALUE)
|
||||
{
|
||||
@ -780,8 +778,8 @@ validate_actionline (const char *line, struct breakpoint *b)
|
||||
/* We have something to collect, make sure that the expr to
|
||||
bytecode translator can handle it and that it's not too
|
||||
long. */
|
||||
aexpr = gen_trace_for_expr (loc->address, exp, trace_string);
|
||||
make_cleanup_free_agent_expr (aexpr);
|
||||
aexpr = gen_trace_for_expr (loc->address, exp.get (), trace_string);
|
||||
old_chain = make_cleanup_free_agent_expr (aexpr);
|
||||
|
||||
if (aexpr->len > MAX_AGENT_EXPR_LEN)
|
||||
error (_("Expression is too complicated."));
|
||||
@ -809,15 +807,14 @@ validate_actionline (const char *line, struct breakpoint *b)
|
||||
p = tmp_p;
|
||||
|
||||
/* Only expressions are allowed for this action. */
|
||||
exp = parse_exp_1 (&p, loc->address,
|
||||
block_for_pc (loc->address), 1);
|
||||
old_chain = make_cleanup (free_current_contents, &exp);
|
||||
expression_up exp = parse_exp_1 (&p, loc->address,
|
||||
block_for_pc (loc->address), 1);
|
||||
|
||||
/* We have something to evaluate, make sure that the expr to
|
||||
bytecode translator can handle it and that it's not too
|
||||
long. */
|
||||
aexpr = gen_eval_for_expr (loc->address, exp);
|
||||
make_cleanup_free_agent_expr (aexpr);
|
||||
aexpr = gen_eval_for_expr (loc->address, exp.get ());
|
||||
old_chain = make_cleanup_free_agent_expr (aexpr);
|
||||
|
||||
if (aexpr->len > MAX_AGENT_EXPR_LEN)
|
||||
error (_("Expression is too complicated."));
|
||||
@ -1399,7 +1396,6 @@ encode_actions_1 (struct command_line *action,
|
||||
struct collection_list *stepping_list)
|
||||
{
|
||||
const char *action_exp;
|
||||
struct expression *exp = NULL;
|
||||
int i;
|
||||
struct value *tempval;
|
||||
struct cmd_list_element *cmd;
|
||||
@ -1501,12 +1497,11 @@ encode_actions_1 (struct command_line *action,
|
||||
else
|
||||
{
|
||||
unsigned long addr;
|
||||
struct cleanup *old_chain = NULL;
|
||||
struct cleanup *old_chain1 = NULL;
|
||||
|
||||
exp = parse_exp_1 (&action_exp, tloc->address,
|
||||
block_for_pc (tloc->address), 1);
|
||||
old_chain = make_cleanup (free_current_contents, &exp);
|
||||
expression_up exp = parse_exp_1 (&action_exp, tloc->address,
|
||||
block_for_pc (tloc->address),
|
||||
1);
|
||||
|
||||
switch (exp->elts[0].opcode)
|
||||
{
|
||||
@ -1528,13 +1523,13 @@ encode_actions_1 (struct command_line *action,
|
||||
|
||||
case UNOP_MEMVAL:
|
||||
/* Safe because we know it's a simple expression. */
|
||||
tempval = evaluate_expression (exp);
|
||||
tempval = evaluate_expression (exp.get ());
|
||||
addr = value_address (tempval);
|
||||
/* Initialize the TYPE_LENGTH if it is a typedef. */
|
||||
check_typedef (exp->elts[1].type);
|
||||
add_memrange (collect, memrange_absolute, addr,
|
||||
TYPE_LENGTH (exp->elts[1].type));
|
||||
append_exp (exp, &collect->computed);
|
||||
append_exp (exp.get (), &collect->computed);
|
||||
break;
|
||||
|
||||
case OP_VAR_VALUE:
|
||||
@ -1556,7 +1551,7 @@ encode_actions_1 (struct command_line *action,
|
||||
break;
|
||||
|
||||
default: /* Full-fledged expression. */
|
||||
aexpr = gen_trace_for_expr (tloc->address, exp,
|
||||
aexpr = gen_trace_for_expr (tloc->address, exp.get (),
|
||||
trace_string);
|
||||
|
||||
old_chain1 = make_cleanup_free_agent_expr (aexpr);
|
||||
@ -1589,10 +1584,9 @@ encode_actions_1 (struct command_line *action,
|
||||
}
|
||||
}
|
||||
|
||||
append_exp (exp, &collect->computed);
|
||||
append_exp (exp.get (), &collect->computed);
|
||||
break;
|
||||
} /* switch */
|
||||
do_cleanups (old_chain);
|
||||
} /* do */
|
||||
}
|
||||
while (action_exp && *action_exp++ == ',');
|
||||
@ -1605,14 +1599,13 @@ encode_actions_1 (struct command_line *action,
|
||||
action_exp = skip_spaces_const (action_exp);
|
||||
|
||||
{
|
||||
struct cleanup *old_chain = NULL;
|
||||
struct cleanup *old_chain1 = NULL;
|
||||
|
||||
exp = parse_exp_1 (&action_exp, tloc->address,
|
||||
block_for_pc (tloc->address), 1);
|
||||
old_chain = make_cleanup (free_current_contents, &exp);
|
||||
expression_up exp = parse_exp_1 (&action_exp, tloc->address,
|
||||
block_for_pc (tloc->address),
|
||||
1);
|
||||
|
||||
aexpr = gen_eval_for_expr (tloc->address, exp);
|
||||
aexpr = gen_eval_for_expr (tloc->address, exp.get ());
|
||||
old_chain1 = make_cleanup_free_agent_expr (aexpr);
|
||||
|
||||
ax_reqs (aexpr);
|
||||
@ -1622,8 +1615,6 @@ encode_actions_1 (struct command_line *action,
|
||||
/* Even though we're not officially collecting, add
|
||||
to the collect list anyway. */
|
||||
add_aexpr (collect, aexpr);
|
||||
|
||||
do_cleanups (old_chain);
|
||||
} /* do */
|
||||
}
|
||||
while (action_exp && *action_exp++ == ',');
|
||||
|
Reference in New Issue
Block a user