X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fmi%2Fmi-cmd-var.c;h=8e0f410a08405b050864bd140f7cb7e67b852597;hb=9a2b4c1ba76f3dff85f08faff0dd08849c2905fb;hp=3f917f74db022dfd76a594ca7114fb7c2ba7dca2;hpb=9265acad39657258bc195251c91368c0ef56382d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 3f917f74db..8e0f410a08 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -1,6 +1,7 @@ /* MI Command Set - varobj commands. - Copyright (C) 2000, 2002, 2004, 2005, 2007 Free Software Foundation, Inc. + Copyright (C) 2000, 2002, 2004, 2005, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. Contributed by Cygnus Solutions (a Red Hat company). @@ -27,6 +28,8 @@ #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"; @@ -38,7 +41,8 @@ static void varobj_update_one (struct varobj *var, enum print_values print_values, int explicit); -static int mi_print_value_p (struct type *type, enum print_values print_values); +static int mi_print_value_p (struct varobj *var, + enum print_values print_values); /* Print variable object VAR. The PRINT_VALUES parameter controls if the value should be printed. The PRINT_EXPRESSION parameter @@ -47,16 +51,22 @@ static void print_varobj (struct varobj *var, enum print_values print_values, int print_expression) { - struct type *gdb_type; char *type; + int thread_id; + char *display_hint; ui_out_field_string (uiout, "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)); - if (mi_print_value_p (varobj_get_gdb_type (var), print_values)) - ui_out_field_string (uiout, "value", varobj_get_value (var)); + if (mi_print_value_p (var, print_values)) + { + char *val = varobj_get_value (var); + + ui_out_field_string (uiout, "value", val); + xfree (val); + } type = varobj_get_type (var); if (type != NULL) @@ -65,13 +75,27 @@ print_varobj (struct varobj *var, enum print_values print_values, xfree (type); } + thread_id = varobj_get_thread_id (var); + if (thread_id > 0) + ui_out_field_int (uiout, "thread-id", thread_id); + if (varobj_get_frozen (var)) ui_out_field_int (uiout, "frozen", 1); + + display_hint = varobj_get_display_hint (var); + if (display_hint) + { + ui_out_field_string (uiout, "displayhint", display_hint); + xfree (display_hint); + } + + if (varobj_pretty_printed_p (var)) + ui_out_field_int (uiout, "dynamic", 1); } /* VAROBJ operations */ -enum mi_cmd_result +void mi_cmd_var_create (char *command, char **argv, int argc) { CORE_ADDR frameaddr = 0; @@ -120,8 +144,8 @@ mi_cmd_var_create (char *command, char **argv, int argc) if (varobjdebug) fprintf_unfiltered (gdb_stdlog, - "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n", - name, frame, paddr (frameaddr), expr); + "Name=\"%s\", Frame=\"%s\" (%s), Expression=\"%s\"\n", + name, frame, hex_string (frameaddr), expr); var = varobj_create (name, expr, frameaddr, var_type); @@ -130,11 +154,12 @@ 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)); + do_cleanups (old_cleanups); - return MI_CMD_DONE; } -enum mi_cmd_result +void mi_cmd_var_delete (char *command, char **argv, int argc) { char *name; @@ -156,7 +181,8 @@ 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")); } @@ -178,24 +204,46 @@ 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.")); - numdel = varobj_delete (var, NULL, children_only_p); ui_out_field_int (uiout, "ndeleted", numdel); do_cleanups (old_cleanups); - return MI_CMD_DONE; } -enum mi_cmd_result +/* Parse a string argument into a format value. */ + +static enum varobj_display_formats +mi_parse_format (const char *arg) +{ + if (arg != NULL) + { + int len; + + len = strlen (arg); + + if (strncmp (arg, "natural", len) == 0) + return FORMAT_NATURAL; + else if (strncmp (arg, "binary", len) == 0) + return FORMAT_BINARY; + else if (strncmp (arg, "decimal", len) == 0) + return FORMAT_DECIMAL; + else if (strncmp (arg, "hexadecimal", len) == 0) + return FORMAT_HEXADECIMAL; + else if (strncmp (arg, "octal", len) == 0) + return FORMAT_OCTAL; + } + + error (_("Must specify the format as: \"natural\", " + "\"binary\", \"decimal\", \"hexadecimal\", or \"octal\"")); +} + +void mi_cmd_var_set_format (char *command, char **argv, int argc) { enum varobj_display_formats format; - int len; struct varobj *var; - char *formspec; + char *val; if (argc != 2) error (_("mi_cmd_var_set_format: Usage: NAME FORMAT.")); @@ -203,37 +251,37 @@ mi_cmd_var_set_format (char *command, char **argv, int argc) /* 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")); - - formspec = argv[1]; - if (formspec == NULL) - error (_("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"")); - - len = strlen (formspec); - - if (strncmp (formspec, "natural", len) == 0) - format = FORMAT_NATURAL; - else if (strncmp (formspec, "binary", len) == 0) - format = FORMAT_BINARY; - else if (strncmp (formspec, "decimal", len) == 0) - format = FORMAT_DECIMAL; - else if (strncmp (formspec, "hexadecimal", len) == 0) - format = FORMAT_HEXADECIMAL; - 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\"")); - + format = mi_parse_format (argv[1]); + /* Set the format of VAR to given format */ varobj_set_display_format (var, format); /* Report the new current format */ ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); - return MI_CMD_DONE; + + /* Report the value in the new format */ + val = varobj_get_value (var); + ui_out_field_string (uiout, "value", val); + xfree (val); } -enum mi_cmd_result +void +mi_cmd_var_set_visualizer (char *command, char **argv, int argc) +{ + struct varobj *var; + + if (argc != 2) + error ("Usage: NAME VISUALIZER_FUNCTION."); + + var = varobj_get_handle (argv[0]); + + if (var == NULL) + error ("Variable object not found"); + + varobj_set_visualizer (var, argv[1]); +} + +void mi_cmd_var_set_frozen (char *command, char **argv, int argc) { struct varobj *var; @@ -243,8 +291,6 @@ mi_cmd_var_set_frozen (char *command, char **argv, int argc) error (_("-var-set-format: Usage: NAME FROZEN_FLAG.")); var = varobj_get_handle (argv[0]); - if (var == NULL) - error (_("Variable object not found")); if (strcmp (argv[1], "0") == 0) frozen = 0; @@ -258,11 +304,10 @@ mi_cmd_var_set_frozen (char *command, char **argv, int argc) /* We don't automatically return the new value, or what varobjs got new values during unfreezing. If this information is required, client should call -var-update explicitly. */ - return MI_CMD_DONE; } -enum mi_cmd_result +void mi_cmd_var_show_format (char *command, char **argv, int argc) { enum varobj_display_formats format; @@ -273,17 +318,14 @@ mi_cmd_var_show_format (char *command, char **argv, int argc) /* 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")); format = varobj_get_display_format (var); /* Report the current format */ ui_out_field_string (uiout, "format", varobj_format_string[(int) format]); - return MI_CMD_DONE; } -enum mi_cmd_result +void mi_cmd_var_info_num_children (char *command, char **argv, int argc) { struct varobj *var; @@ -293,11 +335,8 @@ 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]); - if (var == NULL) - 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. */ @@ -321,11 +360,12 @@ Must be: 0 or \"%s\", 1 or \"%s\", 2 or \"%s\""), } /* Return 1 if given the argument PRINT_VALUES we should display - a value of type TYPE. */ + the varobj VAR. */ static int -mi_print_value_p (struct type *type, enum print_values print_values) +mi_print_value_p (struct varobj *var, enum print_values print_values) { + struct type *type; if (print_values == PRINT_NO_VALUES) return 0; @@ -333,6 +373,10 @@ mi_print_value_p (struct type *type, enum print_values print_values) if (print_values == PRINT_ALL_VALUES) return 1; + if (varobj_pretty_printed_p (var)) + return 1; + + type = varobj_get_gdb_type (var); if (type == NULL) return 1; else @@ -347,59 +391,79 @@ mi_print_value_p (struct type *type, enum print_values print_values) } } -enum mi_cmd_result +void 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; + struct varobj *var; + VEC(varobj_p) *children; + struct varobj *child; enum print_values print_values; + int ix; + int from, to; + char *display_hint; - if (argc != 1 && argc != 2) - error (_("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME")); + if (argc < 1 || argc > 4) + error (_("mi_cmd_var_list_children: Usage: " + "[PRINT_VALUES] NAME [FROM TO]")); /* Get varobj handle, if a valid var obj name was specified */ - if (argc == 1) + if (argc == 1 || argc == 3) var = varobj_get_handle (argv[0]); else var = varobj_get_handle (argv[1]); - if (var == NULL) - error (_("Variable object not found")); - numchild = varobj_list_children (var, &childlist); - ui_out_field_int (uiout, "numchild", numchild); - if (argc == 2) + if (argc > 2) + { + from = atoi (argv[argc - 2]); + to = atoi (argv[argc - 1]); + } + else + { + from = -1; + to = -1; + } + + children = varobj_list_children (var, &from, &to); + ui_out_field_int (uiout, "numchild", to - from); + if (argc == 2 || argc == 4) print_values = mi_parse_values_option (argv[0]); else print_values = PRINT_NO_VALUES; - if (numchild <= 0) + display_hint = varobj_get_display_hint (var); + if (display_hint) { - xfree (childlist); - return MI_CMD_DONE; + ui_out_field_string (uiout, "displayhint", display_hint); + xfree (display_hint); } - 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) + if (from < to) { - struct cleanup *cleanup_child; - cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child"); - print_varobj (*cc, print_values, 1 /* print expression */); - cc++; - do_cleanups (cleanup_child); + struct cleanup *cleanup_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"); + for (ix = from; + ix < to && VEC_iterate (varobj_p, children, ix, child); + ++ix) + { + struct cleanup *cleanup_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); } - do_cleanups (cleanup_children); - xfree (childlist); - return MI_CMD_DONE; + + ui_out_field_int (uiout, "has_more", varobj_has_more (var, to)); } -enum mi_cmd_result +void mi_cmd_var_info_type (char *command, char **argv, int argc) { struct varobj *var; @@ -409,14 +473,11 @@ 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]); - if (var == NULL) - error (_("mi_cmd_var_info_type: Variable object not found")); ui_out_field_string (uiout, "type", varobj_get_type (var)); - return MI_CMD_DONE; } -enum mi_cmd_result +void mi_cmd_var_info_path_expression (char *command, char **argv, int argc) { struct varobj *var; @@ -427,17 +488,13 @@ 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]); - if (var == NULL) - error (_("Variable object not found")); path_expr = varobj_get_path_expr (var); ui_out_field_string (uiout, "path_expr", path_expr); - - return MI_CMD_DONE; } -enum mi_cmd_result +void mi_cmd_var_info_expression (char *command, char **argv, int argc) { enum varobj_languages lang; @@ -448,17 +505,14 @@ mi_cmd_var_info_expression (char *command, char **argv, int argc) /* 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")); 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)); - return MI_CMD_DONE; } -enum mi_cmd_result +void mi_cmd_var_show_attributes (char *command, char **argv, int argc) { int attr; @@ -470,8 +524,6 @@ mi_cmd_var_show_attributes (char *command, char **argv, int argc) /* 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")); attr = varobj_get_attributes (var); /* FIXME: define masks for attributes */ @@ -481,39 +533,87 @@ mi_cmd_var_show_attributes (char *command, char **argv, int argc) attstr = "noneditable"; ui_out_field_string (uiout, "attr", attstr); - return MI_CMD_DONE; } -enum mi_cmd_result +void 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.")); + enum varobj_display_formats format; + int formatFound; + int optind; + char *optarg; + + enum opt + { + OP_FORMAT + }; + static struct mi_opt opts[] = + { + {"f", OP_FORMAT, 1}, + { 0, 0, 0 } + }; + + /* Parse arguments */ + format = FORMAT_NATURAL; + formatFound = 0; + optind = 0; + while (1) + { + int opt = mi_getopt ("-var-evaluate-expression", argc, argv, + opts, &optind, &optarg); - /* 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")); + if (opt < 0) + break; + switch ((enum opt) opt) + { + case OP_FORMAT: + if (formatFound) + error (_("Cannot specify format more than once")); + + format = mi_parse_format (optarg); + formatFound = 1; + break; + } + } + + if (optind >= argc) + error (_("Usage: [-f FORMAT] NAME")); + + if (optind < argc - 1) + error (_("Garbage at end of command")); + + /* Get varobj handle, if a valid var obj name was specified */ + var = varobj_get_handle (argv[optind]); + + if (formatFound) + { + char *val = varobj_get_formatted_value (var, format); + + ui_out_field_string (uiout, "value", val); + xfree (val); + } + else + { + char *val = varobj_get_value (var); - ui_out_field_string (uiout, "value", varobj_get_value (var)); - return MI_CMD_DONE; + ui_out_field_string (uiout, "value", val); + xfree (val); + } } -enum mi_cmd_result +void mi_cmd_var_assign (char *command, char **argv, int argc) { struct varobj *var; - char *expression; + char *expression, *val; if (argc != 2) 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")); if (!varobj_editable_p (var)) error (_("mi_cmd_var_assign: Variable object is not editable")); @@ -521,21 +621,54 @@ mi_cmd_var_assign (char *command, char **argv, int argc) expression = xstrdup (argv[1]); if (!varobj_set_value (var, expression)) - error (_("mi_cmd_var_assign: Could not assign expression to variable object")); + error (_("mi_cmd_var_assign: Could not assign " + "expression to variable object")); + + val = varobj_get_value (var); + ui_out_field_string (uiout, "value", val); + xfree (val); +} + +/* Type used for parameters passing to mi_cmd_var_update_iter. */ + +struct mi_cmd_var_update + { + int only_floating; + enum print_values print_values; + }; + +/* Helper for mi_cmd_var_update - update each VAR. */ + +static void +mi_cmd_var_update_iter (struct varobj *var, void *data_pointer) +{ + struct mi_cmd_var_update *data = data_pointer; + int thread_id, thread_stopped; - ui_out_field_string (uiout, "value", varobj_get_value (var)); - return MI_CMD_DONE; + thread_id = varobj_get_thread_id (var); + + if (thread_id == -1 && is_stopped (inferior_ptid)) + thread_stopped = 1; + else + { + struct thread_info *tp = find_thread_id (thread_id); + + if (tp) + thread_stopped = is_stopped (tp->ptid); + else + thread_stopped = 1; + } + + if (thread_stopped) + if (!data->only_floating || varobj_floating_p (var)) + varobj_update_one (var, data->print_values, 0 /* implicit */); } -enum mi_cmd_result +void 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 && argc != 2) @@ -551,45 +684,36 @@ mi_cmd_var_update (char *command, char **argv, int argc) else print_values = PRINT_NO_VALUES; + 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"); + /* Check if the parameter is a "*" which means that we want to update all variables */ - if ((*name == '*') && (*(name + 1) == '\0')) + if ((*name == '*' || *name == '@') && (*(name + 1) == '\0')) { - nv = varobj_list (&rootlist); - cleanup = make_cleanup (xfree, rootlist); - if (mi_version (uiout) <= 1) - make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); - else - make_cleanup_ui_out_list_begin_end (uiout, "changelist"); - if (nv <= 0) - { - do_cleanups (cleanup); - return MI_CMD_DONE; - } - cr = rootlist; - while (*cr != NULL) - { - varobj_update_one (*cr, print_values, 0 /* implicit */); - cr++; - } - do_cleanups (cleanup); + struct mi_cmd_var_update data; + + data.only_floating = *name == '@'; + data.print_values = print_values; + + /* varobj_update_one automatically updates all the children of VAROBJ. + Therefore update each VAROBJ only once by iterating only the root + VAROBJs. */ + + all_root_varobjs (mi_cmd_var_update_iter, &data); } 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")); + struct varobj *var = varobj_get_handle (name); - 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, 1 /* explicit */); - do_cleanups (cleanup); } - return MI_CMD_DONE; + + do_cleanups (cleanup); } /* Helper for mi_cmd_var_update(). */ @@ -598,59 +722,119 @@ static void varobj_update_one (struct varobj *var, enum print_values print_values, int explicit) { - struct varobj **changelist; - struct varobj **cc; struct cleanup *cleanup = NULL; - int nc; - - nc = varobj_update (&var, &changelist, explicit); - - /* nc >= 0 represents the number of changes reported into changelist. - nc < 0 means that an error occured or the the variable has - changed type (TYPE_CHANGED). */ + VEC (varobj_update_result) *changes; + varobj_update_result *r; + int i; - if (nc == 0) - return; - else if (nc < 0) + changes = varobj_update (&var, explicit); + + for (i = 0; VEC_iterate (varobj_update_result, changes, i, r); ++i) { + char *display_hint; + int from, to; + 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, "name", varobj_get_objname (r->varobj)); - switch (nc) - { - case NOT_IN_SCOPE: + switch (r->status) + { + case VAROBJ_IN_SCOPE: + if (mi_print_value_p (r->varobj, print_values)) + { + char *val = varobj_get_value (r->varobj); + + ui_out_field_string (uiout, "value", val); + xfree (val); + } + ui_out_field_string (uiout, "in_scope", "true"); + break; + case VAROBJ_NOT_IN_SCOPE: ui_out_field_string (uiout, "in_scope", "false"); break; - case INVALID: + case VAROBJ_INVALID: ui_out_field_string (uiout, "in_scope", "invalid"); break; - case TYPE_CHANGED: - 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)); - break; - } - if (mi_version (uiout) > 1) - do_cleanups (cleanup); - } - else - { - cc = changelist; - while (*cc != NULL) + } + + if (r->status != VAROBJ_INVALID) { - 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++; + if (r->type_changed) + ui_out_field_string (uiout, "type_changed", "true"); + else + ui_out_field_string (uiout, "type_changed", "false"); + } + + if (r->type_changed) + ui_out_field_string (uiout, "new_type", varobj_get_type (r->varobj)); + + if (r->type_changed || r->children_changed) + ui_out_field_int (uiout, "new_num_children", + varobj_get_num_children (r->varobj)); + + display_hint = varobj_get_display_hint (var); + if (display_hint) + { + ui_out_field_string (uiout, "displayhint", display_hint); + xfree (display_hint); + } + + if (varobj_pretty_printed_p (var)) + ui_out_field_int (uiout, "dynamic", 1); + + varobj_get_child_range (r->varobj, &from, &to); + ui_out_field_int (uiout, "has_more", + varobj_has_more (r->varobj, to)); + + if (r->new) + { + 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) + { + struct cleanup *cleanup_child; + + cleanup_child + = make_cleanup_ui_out_tuple_begin_end (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. */ } - xfree (changelist); + + if (mi_version (uiout) > 1) + do_cleanups (cleanup); } + VEC_free (varobj_update_result, changes); +} + +void +mi_cmd_enable_pretty_printing (char *command, char **argv, int argc) +{ + if (argc != 0) + error (_("mi_cmd_enable_pretty_printing: no arguments allowed")); + varobj_enable_pretty_printing (); +} + +void +mi_cmd_var_set_update_range (char *command, char **argv, int argc) +{ + struct varobj *var; + int from, to; + + if (argc != 3) + error (_("mi_cmd_var_set_update_range: Usage: VAROBJ FROM TO")); + + var = varobj_get_handle (argv[0]); + from = atoi (argv[1]); + to = atoi (argv[2]); + + varobj_set_child_range (var, from, to); }