From 2f408ecb929bd56613e94cf1e84ace4692c78257 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 8 Nov 2016 15:26:47 +0000 Subject: Use ui_file_as_string throughout more This replaces most of the remaining ui_file_xstrdup calls with ui_file_as_string calls. Whenever a call was replaced, that led to a cascade of other necessary adjustments throughout, to make the code use std::string instead of raw pointers. And then whenever I added a std::string as member of a struct, I needed to adjust allocation/destruction of said struct to use new/delete instead of xmalloc/xfree. The stopping point was once gdb built again. These doesn't seem to be a way to reasonably split this out further. Maybe-not-obvious changes: - demangle_for_lookup returns a cleanup today. To get rid of that, and avoid unnecessary string dupping/copying, this introduces a demangle_result_storage type that the caller instantiates and passes to demangle_for_lookup. - Many methods returned a "char *" to indicate that the caller owns the memory and must free it. Those are switched to return a std::string instead. Methods that return a "view" into some internal string return a "const char *" instead. I.e., we only copy/allocate when necessary. gdb/ChangeLog: 2016-11-08 Pedro Alves * ada-lang.c (ada_name_for_lookup, type_as_string): Use and return std::string. (type_as_string_and_cleanup): Delete. (ada_lookup_struct_elt_type): Use type_as_string. * ada-lang.h (ada_name_for_lookup): Now returns std::string. * ada-varobj.c (ada_varobj_scalar_image): Return a std::string. (ada_varobj_describe_child): Make 'child_name' and 'child_path_expr' parameters std::string pointers. (ada_varobj_describe_struct_child, ada_varobj_describe_ptr_child): Likewise, and use string_printf. (ada_varobj_describe_simple_array_child) (ada_varobj_describe_child): Likewise. (ada_varobj_get_name_of_child, ada_varobj_get_path_expr_of_child) (ada_varobj_get_value_image) (ada_varobj_get_value_of_array_variable) (ada_varobj_get_value_of_variable, ada_name_of_variable) (ada_name_of_child, ada_path_expr_of_child) (ada_value_of_variable): Now returns std::string. Use string_printf. (ada_value_of_child): Adjust. * break-catch-throw.c (check_status_exception_catchpoint): Adjust to use std::string. * breakpoint.c (watch_command_1): Adjust to use std::string. * c-lang.c (c_get_string): Adjust to use std::string. * c-typeprint.c (print_name_maybe_canonical): Use std::string. * c-varobj.c (varobj_is_anonymous_child): Use ==/!= std::string operators. (c_name_of_variable): Now returns a std::string. (c_describe_child): The 'cname' and 'cfull_expression' output parameters are now std::string pointers. Adjust. (c_name_of_child, c_path_expr_of_child, c_value_of_variable) (cplus_number_of_children): Adjust to use std::string and string_printf. (cplus_name_of_variable): Now returns a std::string. (cplus_describe_child): The 'cname' and 'cfull_expression' output parameters are now std::string pointers. Adjust. (cplus_name_of_child, cplus_path_expr_of_child) (cplus_value_of_variable): Now returns a std::string. * cp-abi.c (cplus_typename_from_type_info): Return std::string. * cp-abi.h (cplus_typename_from_type_info): Return std::string. (struct cp_abi_ops) : Return std::string. * cp-support.c (inspect_type): Use std::string. (cp_canonicalize_string_full, cp_canonicalize_string_no_typedefs) (cp_canonicalize_string): Return std::string and adjust. * cp-support.h (cp_canonicalize_string) (cp_canonicalize_string_no_typedefs, cp_canonicalize_string_full): Return std::string. * dbxread.c (read_dbx_symtab): Use std::string. * dwarf2read.c (dwarf2_canonicalize_name): Adjust to use std::string. * gdbcmd.h (lookup_struct_elt_type): Adjust to use std::string. * gnu-v3-abi.c (gnuv3_get_typeid): Use std::string. (gnuv3_get_typename_from_type_info): Return a std::string and adjust. (gnuv3_get_type_from_type_info): Adjust to use std::string. * guile/guile.c (gdbscm_execute_gdb_command): Adjust to use std::string. * infcmd.c (print_return_value_1): Adjust to use std::string. * linespec.c (find_linespec_symbols): Adjust to demangle_for_lookup API change. Use std::string. * mi/mi-cmd-var.c (print_varobj, mi_cmd_var_set_format) (mi_cmd_var_info_type, mi_cmd_var_info_path_expression) (mi_cmd_var_info_expression, mi_cmd_var_evaluate_expression) (mi_cmd_var_assign, varobj_update_one): Adjust to use std::string. * minsyms.c (lookup_minimal_symbol): Use std::string. * python/py-varobj.c (py_varobj_iter_next): Use new instead of XNEW. vitem->name is a std::string now, adjust. * rust-exp.y (convert_ast_to_type, convert_name): Adjust to use std::string. * stabsread.c (define_symbol): Adjust to use std::string. * symtab.c (demangle_for_lookup): Now returns 'const char *'. Add a demangle_result_storage parameter. Use it for storage. (lookup_symbol_in_language) (lookup_symbol_in_objfile_from_linkage_name): Adjust to new demangle_for_lookup API. * symtab.h (struct demangle_result_storage): New type. (demangle_for_lookup): Now returns 'const char *'. Add a demangle_result_storage parameter. * typeprint.c (type_to_string): Return std::string and use ui_file_as_string. * value.h (type_to_string): Change return type to std::string. * varobj-iter.h (struct varobj_item) : Now a std::string. (varobj_iter_delete): Use delete instead of xfree. * varobj.c (create_child): Return std::string instead of char * in output parameter. (name_of_variable, name_of_child, my_value_of_variable): Return std::string instead of char *. (varobj_create, varobj_get_handle): Constify 'objname' parameter. Adjust to std::string fields. (varobj_get_objname): Return a const char * instead of a char *. (varobj_get_expression): Return a std::string. (varobj_list_children): Adjust to use std::string. (varobj_get_type): Return a std::string. (varobj_get_path_expr): Return a const char * instead of a char *. Adjust to std::string fields. (varobj_get_formatted_value, varobj_get_value): Return a std::string. (varobj_set_value): Change type of 'expression' parameter to std::string. Use std::string. (install_new_value): Use std::string. (delete_variable_1): Adjust to use std::string. (create_child): Change the 'name' parameter to a std::string reference. Swap it into the new item's name. (create_child_with_value): Swap item's name into the new child's name. Use string_printf. (new_variable): Use new instead of XNEW. (free_variable): Don't xfree fields that are now std::string. (name_of_variable, name_of_child): Now returns std::string. (value_of_root): Adjust to use std::string. (my_value_of_variable, varobj_value_get_print_value): Return and use std::string. (varobj_value_get_print_value): Adjust to use ui_file_as_string and std::string. * varobj.h (struct varobj) : Now std::string's. : Return std::string. (varobj_create, varobj_get_handle): Constify 'objname' parameter. (varobj_get_objname): Return a const char * instead of a char *. (varobj_get_expression, varobj_get_type): Return a std::string. (varobj_get_path_expr): Return a const char * instead of a char *. (varobj_get_formatted_value, varobj_get_value): Return a std::string. (varobj_set_value): Constify 'expression' parameter. (varobj_value_get_print_value): Return a std::string. --- gdb/mi/mi-cmd-var.c | 70 +++++++++++++++++++---------------------------------- 1 file changed, 25 insertions(+), 45 deletions(-) (limited to 'gdb/mi/mi-cmd-var.c') diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 16d51f9..147e026 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -49,34 +49,28 @@ print_varobj (struct varobj *var, enum print_values print_values, int print_expression) { struct ui_out *uiout = current_uiout; - char *type; int thread_id; char *display_hint; ui_out_field_string (uiout, "name", varobj_get_objname (var)); if (print_expression) { - char *exp = varobj_get_expression (var); + std::string exp = varobj_get_expression (var); - ui_out_field_string (uiout, "exp", exp); - xfree (exp); + ui_out_field_string (uiout, "exp", exp.c_str ()); } ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); if (mi_print_value_p (var, print_values)) { - char *val = varobj_get_value (var); + std::string val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + ui_out_field_string (uiout, "value", val.c_str ()); } - type = varobj_get_type (var); - if (type != NULL) - { - ui_out_field_string (uiout, "type", type); - xfree (type); - } + std::string type = varobj_get_type (var); + if (!type.empty ()) + ui_out_field_string (uiout, "type", type.c_str ()); thread_id = varobj_get_thread_id (var); if (thread_id > 0) @@ -246,7 +240,6 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) { enum varobj_display_formats format; struct varobj *var; - char *val; struct ui_out *uiout = current_uiout; if (argc != 2) @@ -264,9 +257,8 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); /* Report the value in the new format. */ - val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + std::string val = varobj_get_value (var); + ui_out_field_string (uiout, "value", val.c_str ()); } void @@ -454,18 +446,15 @@ mi_cmd_var_info_type (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *type_name; if (argc != 1) error (_("-var-info-type: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - type_name = varobj_get_type (var); - - ui_out_field_string (uiout, "type", type_name); - xfree (type_name); + std::string type_name = varobj_get_type (var); + ui_out_field_string (uiout, "type", type_name.c_str ()); } void @@ -473,7 +462,6 @@ mi_cmd_var_info_path_expression (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *path_expr; if (argc != 1) error (_("Usage: NAME.")); @@ -481,7 +469,7 @@ mi_cmd_var_info_path_expression (char *command, char **argv, int argc) /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - path_expr = varobj_get_path_expr (var); + const char *path_expr = varobj_get_path_expr (var); ui_out_field_string (uiout, "path_expr", path_expr); } @@ -492,7 +480,6 @@ mi_cmd_var_info_expression (char *command, char **argv, int argc) struct ui_out *uiout = current_uiout; const struct language_defn *lang; struct varobj *var; - char *exp; if (argc != 1) error (_("-var-info-expression: Usage: NAME.")); @@ -504,9 +491,8 @@ mi_cmd_var_info_expression (char *command, char **argv, int argc) ui_out_field_string (uiout, "lang", lang->la_natural_name); - exp = varobj_get_expression (var); - ui_out_field_string (uiout, "exp", exp); - xfree (exp); + std::string exp = varobj_get_expression (var); + ui_out_field_string (uiout, "exp", exp.c_str ()); } void @@ -588,17 +574,15 @@ mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) if (formatFound) { - char *val = varobj_get_formatted_value (var, format); + std::string val = varobj_get_formatted_value (var, format); - ui_out_field_string (uiout, "value", val); - xfree (val); + ui_out_field_string (uiout, "value", val.c_str ()); } else { - char *val = varobj_get_value (var); + std::string val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + ui_out_field_string (uiout, "value", val.c_str ()); } } @@ -607,7 +591,6 @@ mi_cmd_var_assign (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *expression, *val; if (argc != 2) error (_("-var-assign: Usage: NAME EXPRESSION.")); @@ -618,7 +601,7 @@ mi_cmd_var_assign (char *command, char **argv, int argc) if (!varobj_editable_p (var)) error (_("-var-assign: Variable object is not editable")); - expression = xstrdup (argv[1]); + const char *expression = argv[1]; /* MI command '-var-assign' may write memory, so suppress memory changed notification if it does. */ @@ -629,9 +612,8 @@ mi_cmd_var_assign (char *command, char **argv, int argc) error (_("-var-assign: Could not assign " "expression to variable object")); - val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); + std::string val = varobj_get_value (var); + ui_out_field_string (uiout, "value", val.c_str ()); } /* Type used for parameters passing to mi_cmd_var_update_iter. */ @@ -752,10 +734,9 @@ varobj_update_one (struct varobj *var, enum print_values print_values, case VAROBJ_IN_SCOPE: if (mi_print_value_p (r->varobj, print_values)) { - char *val = varobj_get_value (r->varobj); + std::string val = varobj_get_value (r->varobj); - ui_out_field_string (uiout, "value", val); - xfree (val); + ui_out_field_string (uiout, "value", val.c_str ()); } ui_out_field_string (uiout, "in_scope", "true"); break; @@ -777,10 +758,9 @@ varobj_update_one (struct varobj *var, enum print_values print_values, if (r->type_changed) { - char *type_name = varobj_get_type (r->varobj); + std::string type_name = varobj_get_type (r->varobj); - ui_out_field_string (uiout, "new_type", type_name); - xfree (type_name); + ui_out_field_string (uiout, "new_type", type_name.c_str ()); } if (r->type_changed || r->children_changed) -- cgit v1.1