X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmi%2Fmi-cmd-var.c;h=f0a9056c4e6131da51ba2a310a943256b03aa572;hb=112e8700a6fd2fed65ca70132c9cbed4132e8bd4;hp=84cdc1562767384cfd26a7dc76782b019ba90c5a;hpb=0e9f083f4cb94a9dc861f38ba151aac06efce2b8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 84cdc15627..f0a9056c4e 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -1,5 +1,5 @@ /* MI Command Set - varobj commands. - Copyright (C) 2000-2013 Free Software Foundation, Inc. + Copyright (C) 2000-2016 Free Software Foundation, Inc. Contributed by Cygnus Solutions (a Red Hat company). @@ -27,7 +27,6 @@ #include "language.h" #include "value.h" #include -#include #include "mi-getopt.h" #include "gdbthread.h" #include "mi-parse.h" @@ -36,7 +35,7 @@ extern unsigned int varobjdebug; /* defined in varobj.c. */ static void varobj_update_one (struct varobj *var, enum print_values print_values, - int explicit); + int is_explicit); static int mi_print_value_p (struct varobj *var, enum print_values print_values); @@ -50,46 +49,41 @@ 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)); + uiout->field_string ("name", varobj_get_objname (var)); if (print_expression) - ui_out_field_string (uiout, "exp", varobj_get_expression (var)); - ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); + { + std::string exp = varobj_get_expression (var); + + uiout->field_string ("exp", exp.c_str ()); + } + uiout->field_int ("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); + uiout->field_string ("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 ()) + uiout->field_string ("type", type.c_str ()); thread_id = varobj_get_thread_id (var); if (thread_id > 0) - ui_out_field_int (uiout, "thread-id", thread_id); + uiout->field_int ("thread-id", thread_id); if (varobj_get_frozen (var)) - ui_out_field_int (uiout, "frozen", 1); + uiout->field_int ("frozen", 1); - display_hint = varobj_get_display_hint (var); + gdb::unique_xmalloc_ptr display_hint = varobj_get_display_hint (var); if (display_hint) - { - ui_out_field_string (uiout, "displayhint", display_hint); - xfree (display_hint); - } + uiout->field_string ("displayhint", display_hint.get ()); - if (varobj_pretty_printed_p (var)) - ui_out_field_int (uiout, "dynamic", 1); + if (varobj_is_dynamic_p (var)) + uiout->field_int ("dynamic", 1); } /* VAROBJ operations */ @@ -150,7 +144,7 @@ mi_cmd_var_create (char *command, char **argv, int argc) print_varobj (var, PRINT_ALL_VALUES, 0 /* don't print expression */); - ui_out_field_int (uiout, "has_more", varobj_has_more (var, 0)); + uiout->field_int ("has_more", varobj_has_more (var, 0)); do_cleanups (old_cleanups); } @@ -201,9 +195,9 @@ mi_cmd_var_delete (char *command, char **argv, int argc) var = varobj_get_handle (name); - numdel = varobj_delete (var, NULL, children_only_p); + numdel = varobj_delete (var, children_only_p); - ui_out_field_int (uiout, "ndeleted", numdel); + uiout->field_int ("ndeleted", numdel); do_cleanups (old_cleanups); } @@ -229,10 +223,12 @@ mi_parse_format (const char *arg) return FORMAT_HEXADECIMAL; else if (strncmp (arg, "octal", len) == 0) return FORMAT_OCTAL; + else if (strncmp (arg, "zero-hexadecimal", len) == 0) + return FORMAT_ZHEXADECIMAL; } error (_("Must specify the format as: \"natural\", " - "\"binary\", \"decimal\", \"hexadecimal\", or \"octal\"")); + "\"binary\", \"decimal\", \"hexadecimal\", \"octal\" or \"zero-hexadecimal\"")); } void @@ -240,7 +236,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) @@ -255,12 +250,11 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) varobj_set_display_format (var, format); /* Report the new current format. */ - ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); + uiout->field_string ("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); + uiout->field_string ("value", val.c_str ()); } void @@ -320,7 +314,7 @@ mi_cmd_var_show_format (char *command, char **argv, int argc) format = varobj_get_display_format (var); /* Report the current format. */ - ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); + uiout->field_string ("format", varobj_format_string[(int) format]); } void @@ -335,7 +329,7 @@ mi_cmd_var_info_num_children (char *command, char **argv, int argc) /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); + uiout->field_int ("numchild", varobj_get_num_children (var)); } /* Return 1 if given the argument PRINT_VALUES we should display @@ -352,7 +346,7 @@ mi_print_value_p (struct varobj *var, enum print_values print_values) if (print_values == PRINT_ALL_VALUES) return 1; - if (varobj_pretty_printed_p (var)) + if (varobj_is_dynamic_p (var)) return 1; type = varobj_get_gdb_type (var); @@ -380,7 +374,6 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) enum print_values print_values; int ix; int from, to; - char *display_hint; if (argc < 1 || argc > 4) error (_("-var-list-children: Usage: " @@ -404,18 +397,15 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) } children = varobj_list_children (var, &from, &to); - ui_out_field_int (uiout, "numchild", to - from); + uiout->field_int ("numchild", to - from); if (argc == 2 || argc == 4) print_values = mi_parse_print_values (argv[0]); else print_values = PRINT_NO_VALUES; - display_hint = varobj_get_display_hint (var); + gdb::unique_xmalloc_ptr display_hint = varobj_get_display_hint (var); if (display_hint) - { - ui_out_field_string (uiout, "displayhint", display_hint); - xfree (display_hint); - } + uiout->field_string ("displayhint", display_hint.get ()); if (from < to) { @@ -440,7 +430,7 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) do_cleanups (cleanup_children); } - ui_out_field_int (uiout, "has_more", varobj_has_more (var, to)); + uiout->field_int ("has_more", varobj_has_more (var, to)); } void @@ -455,7 +445,8 @@ mi_cmd_var_info_type (char *command, char **argv, int argc) /* Get varobj handle, if a valid var obj name was specified. */ var = varobj_get_handle (argv[0]); - ui_out_field_string (uiout, "type", varobj_get_type (var)); + std::string type_name = varobj_get_type (var); + uiout->field_string ("type", type_name.c_str ()); } void @@ -463,7 +454,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.")); @@ -471,9 +461,9 @@ 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); + uiout->field_string ("path_expr", path_expr); } void @@ -491,8 +481,10 @@ mi_cmd_var_info_expression (char *command, char **argv, int argc) lang = varobj_get_language (var); - ui_out_field_string (uiout, "lang", lang->la_natural_name); - ui_out_field_string (uiout, "exp", varobj_get_expression (var)); + uiout->field_string ("lang", lang->la_natural_name); + + std::string exp = varobj_get_expression (var); + uiout->field_string ("exp", exp.c_str ()); } void @@ -516,7 +508,7 @@ mi_cmd_var_show_attributes (char *command, char **argv, int argc) else attstr = "noneditable"; - ui_out_field_string (uiout, "attr", attstr); + uiout->field_string ("attr", attstr); } void @@ -574,17 +566,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); + uiout->field_string ("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); + uiout->field_string ("value", val.c_str ()); } } @@ -593,8 +583,6 @@ mi_cmd_var_assign (char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *expression, *val; - struct cleanup *cleanup; if (argc != 2) error (_("-var-assign: Usage: NAME EXPRESSION.")); @@ -605,23 +593,19 @@ 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. */ - cleanup - = make_cleanup_restore_integer (&mi_suppress_notification.memory); - mi_suppress_notification.memory = 1; + scoped_restore save_suppress + = make_scoped_restore (&mi_suppress_notification.memory, 1); if (!varobj_set_value (var, expression)) error (_("-var-assign: Could not assign " "expression to variable object")); - val = varobj_get_value (var); - ui_out_field_string (uiout, "value", val); - xfree (val); - - do_cleanups (cleanup); + std::string val = varobj_get_value (var); + uiout->field_string ("value", val.c_str ()); } /* Type used for parameters passing to mi_cmd_var_update_iter. */ @@ -637,16 +621,18 @@ struct mi_cmd_var_update static void mi_cmd_var_update_iter (struct varobj *var, void *data_pointer) { - struct mi_cmd_var_update *data = data_pointer; + struct mi_cmd_var_update *data = (struct mi_cmd_var_update *) data_pointer; int thread_id, thread_stopped; thread_id = varobj_get_thread_id (var); - if (thread_id == -1 && is_stopped (inferior_ptid)) + if (thread_id == -1 + && (ptid_equal (inferior_ptid, null_ptid) + || is_stopped (inferior_ptid))) thread_stopped = 1; else { - struct thread_info *tp = find_thread_id (thread_id); + struct thread_info *tp = find_thread_global_id (thread_id); if (tp) thread_stopped = is_stopped (tp->ptid); @@ -716,82 +702,81 @@ mi_cmd_var_update (char *command, char **argv, int argc) static void varobj_update_one (struct varobj *var, enum print_values print_values, - int explicit) + int is_explicit) { struct ui_out *uiout = current_uiout; VEC (varobj_update_result) *changes; varobj_update_result *r; int i; - changes = varobj_update (&var, explicit); + changes = varobj_update (&var, is_explicit); for (i = 0; VEC_iterate (varobj_update_result, changes, i, r); ++i) { - char *display_hint; int from, to; struct cleanup *cleanup = make_cleanup (null_cleanup, NULL); if (mi_version (uiout) > 1) make_cleanup_ui_out_tuple_begin_end (uiout, NULL); - ui_out_field_string (uiout, "name", varobj_get_objname (r->varobj)); + uiout->field_string ("name", varobj_get_objname (r->varobj)); switch (r->status) { 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); + uiout->field_string ("value", val.c_str ()); } - ui_out_field_string (uiout, "in_scope", "true"); + uiout->field_string ("in_scope", "true"); break; case VAROBJ_NOT_IN_SCOPE: - ui_out_field_string (uiout, "in_scope", "false"); + uiout->field_string ("in_scope", "false"); break; case VAROBJ_INVALID: - ui_out_field_string (uiout, "in_scope", "invalid"); + uiout->field_string ("in_scope", "invalid"); break; } if (r->status != VAROBJ_INVALID) { if (r->type_changed) - ui_out_field_string (uiout, "type_changed", "true"); + uiout->field_string ("type_changed", "true"); else - ui_out_field_string (uiout, "type_changed", "false"); + uiout->field_string ("type_changed", "false"); } if (r->type_changed) - ui_out_field_string (uiout, "new_type", varobj_get_type (r->varobj)); + { + std::string type_name = varobj_get_type (r->varobj); + + uiout->field_string ("new_type", type_name.c_str ()); + } if (r->type_changed || r->children_changed) - ui_out_field_int (uiout, "new_num_children", + uiout->field_int ("new_num_children", varobj_get_num_children (r->varobj)); - display_hint = varobj_get_display_hint (r->varobj); + gdb::unique_xmalloc_ptr display_hint + = varobj_get_display_hint (r->varobj); if (display_hint) - { - ui_out_field_string (uiout, "displayhint", display_hint); - xfree (display_hint); - } + uiout->field_string ("displayhint", display_hint.get ()); - if (varobj_pretty_printed_p (r->varobj)) - ui_out_field_int (uiout, "dynamic", 1); + if (varobj_is_dynamic_p (r->varobj)) + uiout->field_int ("dynamic", 1); varobj_get_child_range (r->varobj, &from, &to); - ui_out_field_int (uiout, "has_more", - varobj_has_more (r->varobj, to)); + uiout->field_int ("has_more", varobj_has_more (r->varobj, to)); - if (r->new) + if (r->newobj) { int j; varobj_p child; struct cleanup *cleanup; cleanup = make_cleanup_ui_out_list_begin_end (uiout, "new_children"); - for (j = 0; VEC_iterate (varobj_p, r->new, j, child); ++j) + for (j = 0; VEC_iterate (varobj_p, r->newobj, j, child); ++j) { struct cleanup *cleanup_child; @@ -802,8 +787,8 @@ varobj_update_one (struct varobj *var, enum print_values print_values, } do_cleanups (cleanup); - VEC_free (varobj_p, r->new); - r->new = NULL; /* Paranoia. */ + VEC_free (varobj_p, r->newobj); + r->newobj = NULL; /* Paranoia. */ } do_cleanups (cleanup);