=== gdb/mi/mi-cmd-var.c ================================================================== --- gdb/mi/mi-cmd-var.c (/mirrors/gdb_mainline) (revision 2320) +++ gdb/mi/mi-cmd-var.c (/patches/gdb/varobj_printing/gdb_mainline) (revision 2320) @@ -39,6 +39,33 @@ static int varobj_update_one (struct varobj *var, enum print_values print_values); +static int mi_print_value_p (struct type *type, enum print_values print_values); + +/* Print variable object VAR. The PRINT_VALUES parameter controls + if the value should be printed. The PRINT_EXPRESSION parameter + controls if the expression should be printed. */ +static void +print_varobj (struct varobj *var, enum print_values print_values, + int print_expression) +{ + char *type; + + 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)); + + type = varobj_get_type (var); + if (type != NULL) + { + ui_out_field_string (uiout, "type", type); + xfree (type); + } +} + /* VAROBJ operations */ enum mi_cmd_result @@ -49,7 +76,6 @@ char *name; char *frame; char *expr; - char *type; struct cleanup *old_cleanups; enum varobj_type var_type; @@ -98,16 +124,7 @@ if (var == NULL) 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)); - type = varobj_get_type (var); - if (type == NULL) - ui_out_field_string (uiout, "type", ""); - else - { - ui_out_field_string (uiout, "type", type); - xfree (type); - } + print_varobj (var, PRINT_NO_VALUES, 0 /* don't print expression */); do_cleanups (old_cleanups); return MI_CMD_DONE; @@ -336,17 +353,12 @@ { 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", type); + /* Not printing of the type below is wrong -- frontends can + be programmed easily if all creation of varobj always + return the same information. */ + print_varobj (*cc, print_values, 1 /* print expression */); + cc++; do_cleanups (cleanup_child); - cc++; } do_cleanups (cleanup_children); xfree (childlist);