X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmi%2Fmi-cmd-var.c;h=0a4ed62f89de50ef8bc4bfe27d5ede6db666d93f;hb=2e78302469502f4f8a98144b60c09d4d9b6438fd;hp=558454e70455ed82503dc453748e3b35fdf8b9dc;hpb=28e7fd62340426746f9c896cbc40c5d374ec47aa;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 558454e704..0a4ed62f89 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-2017 Free Software Foundation, Inc. Contributed by Cygnus Solutions (a Red Hat company). @@ -24,21 +24,18 @@ #include "ui-out.h" #include "mi-out.h" #include "varobj.h" +#include "language.h" #include "value.h" #include -#include "gdb_string.h" #include "mi-getopt.h" #include "gdbthread.h" - -const char mi_no_values[] = "--no-values"; -const char mi_simple_values[] = "--simple-values"; -const char mi_all_values[] = "--all-values"; +#include "mi-parse.h" 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); @@ -52,52 +49,47 @@ 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 */ void -mi_cmd_var_create (char *command, char **argv, int argc) +mi_cmd_var_create (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; CORE_ADDR frameaddr = 0; @@ -152,13 +144,13 @@ 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); } void -mi_cmd_var_delete (char *command, char **argv, int argc) +mi_cmd_var_delete (const char *command, char **argv, int argc) { char *name; struct varobj *var; @@ -203,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); } @@ -231,18 +223,19 @@ 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 -mi_cmd_var_set_format (char *command, char **argv, int argc) +mi_cmd_var_set_format (const 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) @@ -257,16 +250,15 @@ 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 -mi_cmd_var_set_visualizer (char *command, char **argv, int argc) +mi_cmd_var_set_visualizer (const char *command, char **argv, int argc) { struct varobj *var; @@ -282,7 +274,7 @@ mi_cmd_var_set_visualizer (char *command, char **argv, int argc) } void -mi_cmd_var_set_frozen (char *command, char **argv, int argc) +mi_cmd_var_set_frozen (const char *command, char **argv, int argc) { struct varobj *var; int frozen; @@ -307,7 +299,7 @@ mi_cmd_var_set_frozen (char *command, char **argv, int argc) } void -mi_cmd_var_show_format (char *command, char **argv, int argc) +mi_cmd_var_show_format (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; enum varobj_display_formats format; @@ -322,11 +314,11 @@ 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 -mi_cmd_var_info_num_children (char *command, char **argv, int argc) +mi_cmd_var_info_num_children (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; @@ -337,27 +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)); -} - -/* Parse a string argument into a print_values value. */ - -static enum print_values -mi_parse_values_option (const char *arg) -{ - if (strcmp (arg, "0") == 0 - || strcmp (arg, mi_no_values) == 0) - return PRINT_NO_VALUES; - else if (strcmp (arg, "1") == 0 - || strcmp (arg, mi_all_values) == 0) - return PRINT_ALL_VALUES; - else if (strcmp (arg, "2") == 0 - || strcmp (arg, mi_simple_values) == 0) - return PRINT_SIMPLE_VALUES; - else - error (_("Unknown value for PRINT_VALUES\n\ -Must be: 0 or \"%s\", 1 or \"%s\", 2 or \"%s\""), - mi_no_values, mi_simple_values, mi_all_values); + uiout->field_int ("numchild", varobj_get_num_children (var)); } /* Return 1 if given the argument PRINT_VALUES we should display @@ -374,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); @@ -393,7 +365,7 @@ mi_print_value_p (struct varobj *var, enum print_values print_values) } void -mi_cmd_var_list_children (char *command, char **argv, int argc) +mi_cmd_var_list_children (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; @@ -402,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: " @@ -426,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_values_option (argv[0]); + 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) { @@ -453,20 +421,18 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) ix < to && VEC_iterate (varobj_p, children, ix, child); ++ix) { - struct cleanup *cleanup_child; + ui_out_emit_tuple child_emitter (uiout, "child"); - cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); print_varobj (child, print_values, 1 /* print expression */); - do_cleanups (cleanup_child); } 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 -mi_cmd_var_info_type (char *command, char **argv, int argc) +mi_cmd_var_info_type (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; @@ -477,15 +443,15 @@ 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 -mi_cmd_var_info_path_expression (char *command, char **argv, int argc) +mi_cmd_var_info_path_expression (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; - char *path_expr; if (argc != 1) error (_("Usage: NAME.")); @@ -493,16 +459,16 @@ 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 -mi_cmd_var_info_expression (char *command, char **argv, int argc) +mi_cmd_var_info_expression (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; - enum varobj_languages lang; + const struct language_defn *lang; struct varobj *var; if (argc != 1) @@ -513,16 +479,18 @@ mi_cmd_var_info_expression (char *command, char **argv, int argc) lang = varobj_get_language (var); - ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]); - 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 -mi_cmd_var_show_attributes (char *command, char **argv, int argc) +mi_cmd_var_show_attributes (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; int attr; - char *attstr; + const char *attstr; struct varobj *var; if (argc != 1) @@ -538,11 +506,11 @@ 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 -mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) +mi_cmd_var_evaluate_expression (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct varobj *var; @@ -596,27 +564,23 @@ 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 ()); } } void -mi_cmd_var_assign (char *command, char **argv, int argc) +mi_cmd_var_assign (const 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.")); @@ -627,23 +591,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. */ @@ -659,16 +619,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); @@ -682,7 +644,7 @@ mi_cmd_var_update_iter (struct varobj *var, void *data_pointer) } void -mi_cmd_var_update (char *command, char **argv, int argc) +mi_cmd_var_update (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; struct cleanup *cleanup; @@ -698,7 +660,7 @@ mi_cmd_var_update (char *command, char **argv, int argc) name = argv[1]; if (argc == 2) - print_values = mi_parse_values_option (argv[0]); + print_values = mi_parse_print_values (argv[0]); else print_values = PRINT_NO_VALUES; @@ -738,104 +700,98 @@ 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; - struct cleanup *cleanup = NULL; 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) - cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); - ui_out_field_string (uiout, "name", varobj_get_objname (r->varobj)); + make_cleanup_ui_out_tuple_begin_end (uiout, NULL); + 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; - - cleanup_child - = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); + ui_out_emit_tuple tuple_emitter (uiout, NULL); print_varobj (child, print_values, 1 /* print_expression */); - do_cleanups (cleanup_child); } do_cleanups (cleanup); - VEC_free (varobj_p, r->new); - r->new = NULL; /* Paranoia. */ + VEC_free (varobj_p, r->newobj); + r->newobj = NULL; /* Paranoia. */ } - if (mi_version (uiout) > 1) - do_cleanups (cleanup); + do_cleanups (cleanup); } VEC_free (varobj_update_result, changes); } void -mi_cmd_enable_pretty_printing (char *command, char **argv, int argc) +mi_cmd_enable_pretty_printing (const char *command, char **argv, int argc) { if (argc != 0) error (_("-enable-pretty-printing: no arguments allowed")); @@ -844,7 +800,7 @@ mi_cmd_enable_pretty_printing (char *command, char **argv, int argc) } void -mi_cmd_var_set_update_range (char *command, char **argv, int argc) +mi_cmd_var_set_update_range (const char *command, char **argv, int argc) { struct varobj *var; int from, to;