diff options
author | Pedro Alves <palves@redhat.com> | 2016-11-08 15:26:43 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2016-11-08 15:26:43 +0000 |
commit | 4d01a485d29732b19743e8b138897f3509e071b0 (patch) | |
tree | 3f666c1df62e513947eae6f14c663175726938fa /gdb/printcmd.c | |
parent | b064640146bb6908a0ccca27ca8ee2b06b668137 (diff) | |
download | gdb-4d01a485d29732b19743e8b138897f3509e071b0.zip gdb-4d01a485d29732b19743e8b138897f3509e071b0.tar.gz gdb-4d01a485d29732b19743e8b138897f3509e071b0.tar.bz2 |
'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.
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r-- | gdb/printcmd.c | 56 |
1 files changed, 18 insertions, 38 deletions
diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 7180fda..b70ed19 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -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; } } |