X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmi%2Fmi-cmd-var.c;h=df244cc0d85f9c365595b2091e4f0da843b921fa;hb=1ecb4ee0309ec7962314a8f98d45ac91be48aebf;hp=771d8ef37dcd299c45a64e00764a6a88b5faeebc;hpb=d0352a18a504a4e7b761f6b3264cf11347d8d056;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 771d8ef37d..df244cc0d8 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -1,5 +1,7 @@ /* MI Command Set - varobj commands. - Copyright (C) 2000, Free Software Foundation, Inc. + + Copyright 2000, 2002, 2004, 2005 Free Software Foundation, Inc. + Contributed by Cygnus Solutions (a Red Hat company). This file is part of GDB. @@ -26,15 +28,16 @@ #include "varobj.h" #include "value.h" #include +#include "gdb_string.h" -/* Convenience macro for allocting typesafe memory. */ - -#undef XMALLOC -#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE)) +const char mi_no_values[] = "--no-values"; +const char mi_simple_values[] = "--simple-values"; +const char mi_all_values[] = "--all-values"; extern int varobjdebug; /* defined in varobj.c */ -static int varobj_update_one (struct varobj *var); +static int varobj_update_one (struct varobj *var, + enum print_values print_values); /* VAROBJ operations */ @@ -52,10 +55,9 @@ mi_cmd_var_create (char *command, char **argv, int argc) if (argc != 3) { - /* asprintf (&mi_error_message, - "mi_cmd_var_create: Usage: ."); - return MI_CMD_ERROR; */ - error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION."); + /* mi_error_message = xstrprintf ("mi_cmd_var_create: Usage: + ...."); return MI_CMD_ERROR; */ + error (_("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.")); } name = xstrdup (argv[0]); @@ -64,17 +66,17 @@ mi_cmd_var_create (char *command, char **argv, int argc) old_cleanups = make_cleanup (free_current_contents, &name); frame = xstrdup (argv[1]); - old_cleanups = make_cleanup (free, frame); + old_cleanups = make_cleanup (xfree, frame); expr = xstrdup (argv[2]); if (strcmp (name, "-") == 0) { - free (name); + xfree (name); name = varobj_gen_name (); } else if (!isalpha (*name)) - error ("mi_cmd_var_create: name of object must begin with a letter"); + error (_("mi_cmd_var_create: name of object must begin with a letter")); if (strcmp (frame, "*") == 0) var_type = USE_CURRENT_FRAME; @@ -83,7 +85,7 @@ mi_cmd_var_create (char *command, char **argv, int argc) else { var_type = USE_SPECIFIED_FRAME; - frameaddr = parse_and_eval_address (frame); + frameaddr = string_to_core_addr (frame); } if (varobjdebug) @@ -94,7 +96,7 @@ mi_cmd_var_create (char *command, char **argv, int argc) var = varobj_create (name, expr, frameaddr, var_type); if (var == NULL) - error ("mi_cmd_var_create: unable to create variable object"); + error (_("mi_cmd_var_create: unable to create variable object")); ui_out_field_string (uiout, "name", name); ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); @@ -104,7 +106,7 @@ mi_cmd_var_create (char *command, char **argv, int argc) else { ui_out_field_string (uiout, "type", type); - free (type); + xfree (type); } do_cleanups (old_cleanups); @@ -122,7 +124,7 @@ mi_cmd_var_delete (char *command, char **argv, int argc) struct cleanup *old_cleanups; if (argc < 1 || argc > 2) - error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION."); + error (_("mi_cmd_var_delete: Usage: [-c] EXPRESSION.")); name = xstrdup (argv[0]); /* Add cleanup for name. Must be free_current_contents as @@ -134,9 +136,9 @@ mi_cmd_var_delete (char *command, char **argv, int argc) if (argc == 1) { if (strcmp (name, "-c") == 0) - error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name"); + error (_("mi_cmd_var_delete: Missing required argument after '-c': variable object name")); if (*name == '-') - error ("mi_cmd_var_delete: Illegal variable object name"); + error (_("mi_cmd_var_delete: Illegal variable object name")); } /* If we have 2 arguments they must be '-c' followed by a string @@ -145,11 +147,11 @@ mi_cmd_var_delete (char *command, char **argv, int argc) { expr = xstrdup (argv[1]); if (strcmp (name, "-c") != 0) - error ("mi_cmd_var_delete: Invalid option."); + error (_("mi_cmd_var_delete: Invalid option.")); children_only_p = 1; - free (name); + xfree (name); name = xstrdup (expr); - free (expr); + xfree (expr); } /* If we didn't error out, now NAME contains the name of the @@ -158,7 +160,7 @@ mi_cmd_var_delete (char *command, char **argv, int argc) var = varobj_get_handle (name); if (var == NULL) - error ("mi_cmd_var_delete: Variable object not found."); + error (_("mi_cmd_var_delete: Variable object not found.")); numdel = varobj_delete (var, NULL, children_only_p); @@ -177,32 +179,32 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) char *formspec; if (argc != 2) - error ("mi_cmd_var_set_format: Usage: NAME FORMAT."); + error (_("mi_cmd_var_set_format: Usage: NAME FORMAT.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_set_format: Variable object not found"); + error (_("mi_cmd_var_set_format: Variable object not found")); formspec = xstrdup (argv[1]); if (formspec == NULL) - error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\""); + error (_("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"")); len = strlen (formspec); - if (STREQN (formspec, "natural", len)) + if (strncmp (formspec, "natural", len) == 0) format = FORMAT_NATURAL; - else if (STREQN (formspec, "binary", len)) + else if (strncmp (formspec, "binary", len) == 0) format = FORMAT_BINARY; - else if (STREQN (formspec, "decimal", len)) + else if (strncmp (formspec, "decimal", len) == 0) format = FORMAT_DECIMAL; - else if (STREQN (formspec, "hexadecimal", len)) + else if (strncmp (formspec, "hexadecimal", len) == 0) format = FORMAT_HEXADECIMAL; - else if (STREQN (formspec, "octal", len)) + else if (strncmp (formspec, "octal", len) == 0) format = FORMAT_OCTAL; else - error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\""); + error (_("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"")); /* Set the format of VAR to given format */ varobj_set_display_format (var, format); @@ -219,12 +221,12 @@ mi_cmd_var_show_format (char *command, char **argv, int argc) struct varobj *var; if (argc != 1) - error ("mi_cmd_var_show_format: Usage: NAME."); + error (_("mi_cmd_var_show_format: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_show_format: Variable object not found"); + error (_("mi_cmd_var_show_format: Variable object not found")); format = varobj_get_display_format (var); @@ -239,57 +241,115 @@ mi_cmd_var_info_num_children (char *command, char **argv, int argc) struct varobj *var; if (argc != 1) - error ("mi_cmd_var_info_num_children: Usage: NAME."); + error (_("mi_cmd_var_info_num_children: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_info_num_children: Variable object not found"); + error (_("mi_cmd_var_info_num_children: Variable object not found")); ui_out_field_int (uiout, "numchild", varobj_get_num_children (var)); return MI_CMD_DONE; } +/* 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); +} + +/* Return 1 if given the argument PRINT_VALUES we should display + a value of type TYPE. */ + +static int +mi_print_value_p (struct type *type, enum print_values print_values) +{ + if (type != NULL) + type = check_typedef (type); + + if (print_values == PRINT_NO_VALUES) + return 0; + + if (print_values == PRINT_ALL_VALUES) + return 1; + + /* For PRINT_SIMPLE_VALUES, only print the value if it has a type + and that type is not a compound type. */ + + return (TYPE_CODE (type) != TYPE_CODE_ARRAY + && TYPE_CODE (type) != TYPE_CODE_STRUCT + && TYPE_CODE (type) != TYPE_CODE_UNION); +} + enum mi_cmd_result mi_cmd_var_list_children (char *command, char **argv, int argc) { struct varobj *var; struct varobj **childlist; struct varobj **cc; + struct cleanup *cleanup_children; int numchild; char *type; + enum print_values print_values; - if (argc != 1) - error ("mi_cmd_var_list_children: Usage: NAME."); + if (argc != 1 && argc != 2) + error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME")); /* Get varobj handle, if a valid var obj name was specified */ - var = varobj_get_handle (argv[0]); + if (argc == 1) + var = varobj_get_handle (argv[0]); + else + var = varobj_get_handle (argv[1]); if (var == NULL) - error ("mi_cmd_var_list_children: Variable object not found"); + error (_("Variable object not found")); numchild = varobj_list_children (var, &childlist); ui_out_field_int (uiout, "numchild", numchild); + if (argc == 2) + print_values = mi_parse_values_option (argv[0]); + else + print_values = PRINT_NO_VALUES; if (numchild <= 0) return MI_CMD_DONE; - ui_out_list_begin (uiout, "children"); + if (mi_version (uiout) == 1) + cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children"); + else + cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children"); cc = childlist; while (*cc != NULL) { - ui_out_list_begin (uiout, "child"); + struct cleanup *cleanup_child; + cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); ui_out_field_string (uiout, "name", varobj_get_objname (*cc)); ui_out_field_string (uiout, "exp", varobj_get_expression (*cc)); ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc)); + if (mi_print_value_p (varobj_get_gdb_type (*cc), print_values)) + ui_out_field_string (uiout, "value", varobj_get_value (*cc)); type = varobj_get_type (*cc); /* C++ pseudo-variables (public, private, protected) do not have a type */ if (type) - ui_out_field_string (uiout, "type", varobj_get_type (*cc)); - ui_out_list_end (uiout); + ui_out_field_string (uiout, "type", type); + do_cleanups (cleanup_child); cc++; } - ui_out_list_end (uiout); - free (childlist); + do_cleanups (cleanup_children); + xfree (childlist); return MI_CMD_DONE; } @@ -299,12 +359,12 @@ mi_cmd_var_info_type (char *command, char **argv, int argc) struct varobj *var; if (argc != 1) - error ("mi_cmd_var_info_type: Usage: NAME."); + error (_("mi_cmd_var_info_type: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_info_type: Variable object not found"); + error (_("mi_cmd_var_info_type: Variable object not found")); ui_out_field_string (uiout, "type", varobj_get_type (var)); return MI_CMD_DONE; @@ -317,12 +377,12 @@ mi_cmd_var_info_expression (char *command, char **argv, int argc) struct varobj *var; if (argc != 1) - error ("mi_cmd_var_info_expression: Usage: NAME."); + error (_("mi_cmd_var_info_expression: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_info_expression: Variable object not found"); + error (_("mi_cmd_var_info_expression: Variable object not found")); lang = varobj_get_language (var); @@ -339,12 +399,12 @@ mi_cmd_var_show_attributes (char *command, char **argv, int argc) struct varobj *var; if (argc != 1) - error ("mi_cmd_var_show_attributes: Usage: NAME."); + error (_("mi_cmd_var_show_attributes: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_show_attributes: Variable object not found"); + error (_("mi_cmd_var_show_attributes: Variable object not found")); attr = varobj_get_attributes (var); /* FIXME: define masks for attributes */ @@ -363,12 +423,12 @@ mi_cmd_var_evaluate_expression (char *command, char **argv, int argc) struct varobj *var; if (argc != 1) - error ("mi_cmd_var_evaluate_expression: Usage: NAME."); + error (_("mi_cmd_var_evaluate_expression: Usage: NAME.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_evaluate_expression: Variable object not found"); + error (_("mi_cmd_var_evaluate_expression: Variable object not found")); ui_out_field_string (uiout, "value", varobj_get_value (var)); return MI_CMD_DONE; @@ -381,21 +441,21 @@ mi_cmd_var_assign (char *command, char **argv, int argc) char *expression; if (argc != 2) - error ("mi_cmd_var_assign: Usage: NAME EXPRESSION."); + error (_("mi_cmd_var_assign: Usage: NAME EXPRESSION.")); /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (argv[0]); if (var == NULL) - error ("mi_cmd_var_assign: Variable object not found"); + error (_("mi_cmd_var_assign: Variable object not found")); /* FIXME: define masks for attributes */ if (!(varobj_get_attributes (var) & 0x00000001)) - error ("mi_cmd_var_assign: Variable object is not editable"); + error (_("mi_cmd_var_assign: Variable object is not editable")); expression = xstrdup (argv[1]); if (!varobj_set_value (var, expression)) - error ("mi_cmd_var_assign: Could not assign expression to varible object"); + error (_("mi_cmd_var_assign: Could not assign expression to varible object")); ui_out_field_string (uiout, "value", varobj_get_value (var)); return MI_CMD_DONE; @@ -407,13 +467,23 @@ mi_cmd_var_update (char *command, char **argv, int argc) struct varobj *var; struct varobj **rootlist; struct varobj **cr; + struct cleanup *cleanup; char *name; int nv; + enum print_values print_values; - if (argc != 1) - error ("mi_cmd_var_update: Usage: NAME."); + if (argc != 1 && argc != 2) + error (_("mi_cmd_var_update: Usage: [PRINT_VALUES] NAME.")); + + if (argc == 1) + name = argv[0]; + else + name = (argv[1]); - name = argv[0]; + if (argc == 2) + print_values = mi_parse_values_option (argv[0]); + else + print_values = PRINT_NO_VALUES; /* Check if the parameter is a "*" which means that we want to update all variables */ @@ -421,31 +491,37 @@ mi_cmd_var_update (char *command, char **argv, int argc) if ((*name == '*') && (*(name + 1) == '\0')) { nv = varobj_list (&rootlist); - ui_out_list_begin (uiout, "changelist"); + if (mi_version (uiout) <= 1) + cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); + else + cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); if (nv <= 0) { - ui_out_list_end (uiout); + do_cleanups (cleanup); return MI_CMD_DONE; } cr = rootlist; while (*cr != NULL) { - varobj_update_one (*cr); + varobj_update_one (*cr, print_values); cr++; } - free (rootlist); - ui_out_list_end (uiout); + xfree (rootlist); + do_cleanups (cleanup); } else { /* Get varobj handle, if a valid var obj name was specified */ var = varobj_get_handle (name); if (var == NULL) - error ("mi_cmd_var_update: Variable object not found"); - - ui_out_list_begin (uiout, "changelist"); - varobj_update_one (var); - ui_out_list_end (uiout); + error (_("mi_cmd_var_update: Variable object not found")); + + if (mi_version (uiout) <= 1) + cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); + else + cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); + varobj_update_one (var, print_values); + do_cleanups (cleanup); } return MI_CMD_DONE; } @@ -455,13 +531,14 @@ mi_cmd_var_update (char *command, char **argv, int argc) scope), and 1 if it succeeds. */ static int -varobj_update_one (struct varobj *var) +varobj_update_one (struct varobj *var, enum print_values print_values) { struct varobj **changelist; struct varobj **cc; + struct cleanup *cleanup = NULL; int nc; - nc = varobj_update (var, &changelist); + nc = varobj_update (&var, &changelist); /* nc == 0 means that nothing has changed. nc == -1 means that an error occured in updating the variable. @@ -471,17 +548,25 @@ varobj_update_one (struct varobj *var) return 1; else if (nc == -1) { + if (mi_version (uiout) > 1) + cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_string (uiout, "name", varobj_get_objname(var)); ui_out_field_string (uiout, "in_scope", "false"); + if (mi_version (uiout) > 1) + do_cleanups (cleanup); return -1; } else if (nc == -2) { + if (mi_version (uiout) > 1) + cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL); ui_out_field_string (uiout, "name", varobj_get_objname (var)); ui_out_field_string (uiout, "in_scope", "true"); ui_out_field_string (uiout, "new_type", varobj_get_type(var)); ui_out_field_int (uiout, "new_num_children", varobj_get_num_children(var)); + if (mi_version (uiout) > 1) + do_cleanups (cleanup); } else { @@ -489,12 +574,18 @@ varobj_update_one (struct varobj *var) cc = changelist; while (*cc != 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 (*cc)); + if (mi_print_value_p (varobj_get_gdb_type (*cc), print_values)) + ui_out_field_string (uiout, "value", varobj_get_value (*cc)); ui_out_field_string (uiout, "in_scope", "true"); ui_out_field_string (uiout, "type_changed", "false"); + if (mi_version (uiout) > 1) + do_cleanups (cleanup); cc++; } - free (changelist); + xfree (changelist); return 1; } return 1;