Home | History | Annotate | Line # | Download | only in mi
mi-cmd-var.c revision 1.8
      1 /* MI Command Set - varobj commands.
      2    Copyright (C) 2000-2019 Free Software Foundation, Inc.
      3 
      4    Contributed by Cygnus Solutions (a Red Hat company).
      5 
      6    This file is part of GDB.
      7 
      8    This program is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3 of the License, or
     11    (at your option) any later version.
     12 
     13    This program is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     20 
     21 #include "defs.h"
     22 #include "mi-cmds.h"
     23 #include "mi-main.h"
     24 #include "ui-out.h"
     25 #include "mi-out.h"
     26 #include "varobj.h"
     27 #include "language.h"
     28 #include "value.h"
     29 #include <ctype.h>
     30 #include "mi-getopt.h"
     31 #include "gdbthread.h"
     32 #include "mi-parse.h"
     33 #include "common/gdb_optional.h"
     34 #include "inferior.h"
     35 
     36 extern unsigned int varobjdebug;		/* defined in varobj.c.  */
     37 
     38 static void varobj_update_one (struct varobj *var,
     39 			       enum print_values print_values,
     40 			       bool is_explicit);
     41 
     42 static int mi_print_value_p (struct varobj *var,
     43 			     enum print_values print_values);
     44 
     45 /* Print variable object VAR.  The PRINT_VALUES parameter controls
     46    if the value should be printed.  The PRINT_EXPRESSION parameter
     47    controls if the expression should be printed.  */
     48 
     49 static void
     50 print_varobj (struct varobj *var, enum print_values print_values,
     51 	      int print_expression)
     52 {
     53   struct ui_out *uiout = current_uiout;
     54   int thread_id;
     55 
     56   uiout->field_string ("name", varobj_get_objname (var));
     57   if (print_expression)
     58     {
     59       std::string exp = varobj_get_expression (var);
     60 
     61       uiout->field_string ("exp", exp.c_str ());
     62     }
     63   uiout->field_int ("numchild", varobj_get_num_children (var));
     64 
     65   if (mi_print_value_p (var, print_values))
     66     {
     67       std::string val = varobj_get_value (var);
     68 
     69       uiout->field_string ("value", val.c_str ());
     70     }
     71 
     72   std::string type = varobj_get_type (var);
     73   if (!type.empty ())
     74     uiout->field_string ("type", type.c_str ());
     75 
     76   thread_id = varobj_get_thread_id (var);
     77   if (thread_id > 0)
     78     uiout->field_int ("thread-id", thread_id);
     79 
     80   if (varobj_get_frozen (var))
     81     uiout->field_int ("frozen", 1);
     82 
     83   gdb::unique_xmalloc_ptr<char> display_hint = varobj_get_display_hint (var);
     84   if (display_hint)
     85     uiout->field_string ("displayhint", display_hint.get ());
     86 
     87   if (varobj_is_dynamic_p (var))
     88     uiout->field_int ("dynamic", 1);
     89 }
     90 
     91 /* VAROBJ operations */
     92 
     93 void
     94 mi_cmd_var_create (const char *command, char **argv, int argc)
     95 {
     96   struct ui_out *uiout = current_uiout;
     97   CORE_ADDR frameaddr = 0;
     98   struct varobj *var;
     99   char *frame;
    100   char *expr;
    101   enum varobj_type var_type;
    102 
    103   if (argc != 3)
    104     error (_("-var-create: Usage: NAME FRAME EXPRESSION."));
    105 
    106   frame = argv[1];
    107   expr = argv[2];
    108 
    109   const char *name = argv[0];
    110   std::string gen_name;
    111   if (strcmp (name, "-") == 0)
    112     {
    113       gen_name = varobj_gen_name ();
    114       name = gen_name.c_str ();
    115     }
    116   else if (!isalpha (name[0]))
    117     error (_("-var-create: name of object must begin with a letter"));
    118 
    119   if (strcmp (frame, "*") == 0)
    120     var_type = USE_CURRENT_FRAME;
    121   else if (strcmp (frame, "@") == 0)
    122     var_type = USE_SELECTED_FRAME;
    123   else
    124     {
    125       var_type = USE_SPECIFIED_FRAME;
    126       frameaddr = string_to_core_addr (frame);
    127     }
    128 
    129   if (varobjdebug)
    130     fprintf_unfiltered (gdb_stdlog,
    131 			"Name=\"%s\", Frame=\"%s\" (%s), Expression=\"%s\"\n",
    132 			name, frame, hex_string (frameaddr), expr);
    133 
    134   var = varobj_create (name, expr, frameaddr, var_type);
    135 
    136   if (var == NULL)
    137     error (_("-var-create: unable to create variable object"));
    138 
    139   print_varobj (var, PRINT_ALL_VALUES, 0 /* don't print expression */);
    140 
    141   uiout->field_int ("has_more", varobj_has_more (var, 0));
    142 }
    143 
    144 void
    145 mi_cmd_var_delete (const char *command, char **argv, int argc)
    146 {
    147   char *name;
    148   struct varobj *var;
    149   int numdel;
    150   int children_only_p = 0;
    151   struct ui_out *uiout = current_uiout;
    152 
    153   if (argc < 1 || argc > 2)
    154     error (_("-var-delete: Usage: [-c] EXPRESSION."));
    155 
    156   name = argv[0];
    157 
    158   /* If we have one single argument it cannot be '-c' or any string
    159      starting with '-'.  */
    160   if (argc == 1)
    161     {
    162       if (strcmp (name, "-c") == 0)
    163 	error (_("-var-delete: Missing required "
    164 		 "argument after '-c': variable object name"));
    165       if (*name == '-')
    166 	error (_("-var-delete: Illegal variable object name"));
    167     }
    168 
    169   /* If we have 2 arguments they must be '-c' followed by a string
    170      which would be the variable name.  */
    171   if (argc == 2)
    172     {
    173       if (strcmp (name, "-c") != 0)
    174 	error (_("-var-delete: Invalid option."));
    175       children_only_p = 1;
    176       name = argv[1];
    177     }
    178 
    179   /* If we didn't error out, now NAME contains the name of the
    180      variable.  */
    181 
    182   var = varobj_get_handle (name);
    183 
    184   numdel = varobj_delete (var, children_only_p);
    185 
    186   uiout->field_int ("ndeleted", numdel);
    187 }
    188 
    189 /* Parse a string argument into a format value.  */
    190 
    191 static enum varobj_display_formats
    192 mi_parse_format (const char *arg)
    193 {
    194   if (arg != NULL)
    195     {
    196       int len;
    197 
    198       len = strlen (arg);
    199 
    200       if (strncmp (arg, "natural", len) == 0)
    201 	return FORMAT_NATURAL;
    202       else if (strncmp (arg, "binary", len) == 0)
    203 	return FORMAT_BINARY;
    204       else if (strncmp (arg, "decimal", len) == 0)
    205 	return FORMAT_DECIMAL;
    206       else if (strncmp (arg, "hexadecimal", len) == 0)
    207 	return FORMAT_HEXADECIMAL;
    208       else if (strncmp (arg, "octal", len) == 0)
    209 	return FORMAT_OCTAL;
    210       else if (strncmp (arg, "zero-hexadecimal", len) == 0)
    211 	return FORMAT_ZHEXADECIMAL;
    212     }
    213 
    214   error (_("Must specify the format as: \"natural\", "
    215 	   "\"binary\", \"decimal\", \"hexadecimal\", \"octal\" or \"zero-hexadecimal\""));
    216 }
    217 
    218 void
    219 mi_cmd_var_set_format (const char *command, char **argv, int argc)
    220 {
    221   enum varobj_display_formats format;
    222   struct varobj *var;
    223   struct ui_out *uiout = current_uiout;
    224 
    225   if (argc != 2)
    226     error (_("-var-set-format: Usage: NAME FORMAT."));
    227 
    228   /* Get varobj handle, if a valid var obj name was specified.  */
    229   var = varobj_get_handle (argv[0]);
    230 
    231   format = mi_parse_format (argv[1]);
    232 
    233   /* Set the format of VAR to the given format.  */
    234   varobj_set_display_format (var, format);
    235 
    236   /* Report the new current format.  */
    237   uiout->field_string ("format", varobj_format_string[(int) format]);
    238 
    239   /* Report the value in the new format.  */
    240   std::string val = varobj_get_value (var);
    241   uiout->field_string ("value", val.c_str ());
    242 }
    243 
    244 void
    245 mi_cmd_var_set_visualizer (const char *command, char **argv, int argc)
    246 {
    247   struct varobj *var;
    248 
    249   if (argc != 2)
    250     error (_("Usage: NAME VISUALIZER_FUNCTION."));
    251 
    252   var = varobj_get_handle (argv[0]);
    253 
    254   if (var == NULL)
    255     error (_("Variable object not found"));
    256 
    257   varobj_set_visualizer (var, argv[1]);
    258 }
    259 
    260 void
    261 mi_cmd_var_set_frozen (const char *command, char **argv, int argc)
    262 {
    263   struct varobj *var;
    264   bool frozen;
    265 
    266   if (argc != 2)
    267     error (_("-var-set-format: Usage: NAME FROZEN_FLAG."));
    268 
    269   var = varobj_get_handle (argv[0]);
    270 
    271   if (strcmp (argv[1], "0") == 0)
    272     frozen = false;
    273   else if (strcmp (argv[1], "1") == 0)
    274     frozen = true;
    275   else
    276     error (_("Invalid flag value"));
    277 
    278   varobj_set_frozen (var, frozen);
    279 
    280   /* We don't automatically return the new value, or what varobjs got
    281      new values during unfreezing.  If this information is required,
    282      client should call -var-update explicitly.  */
    283 }
    284 
    285 void
    286 mi_cmd_var_show_format (const char *command, char **argv, int argc)
    287 {
    288   struct ui_out *uiout = current_uiout;
    289   enum varobj_display_formats format;
    290   struct varobj *var;
    291 
    292   if (argc != 1)
    293     error (_("-var-show-format: Usage: NAME."));
    294 
    295   /* Get varobj handle, if a valid var obj name was specified.  */
    296   var = varobj_get_handle (argv[0]);
    297 
    298   format = varobj_get_display_format (var);
    299 
    300   /* Report the current format.  */
    301   uiout->field_string ("format", varobj_format_string[(int) format]);
    302 }
    303 
    304 void
    305 mi_cmd_var_info_num_children (const char *command, char **argv, int argc)
    306 {
    307   struct ui_out *uiout = current_uiout;
    308   struct varobj *var;
    309 
    310   if (argc != 1)
    311     error (_("-var-info-num-children: Usage: NAME."));
    312 
    313   /* Get varobj handle, if a valid var obj name was specified.  */
    314   var = varobj_get_handle (argv[0]);
    315 
    316   uiout->field_int ("numchild", varobj_get_num_children (var));
    317 }
    318 
    319 /* Return 1 if given the argument PRINT_VALUES we should display
    320    the varobj VAR.  */
    321 
    322 static int
    323 mi_print_value_p (struct varobj *var, enum print_values print_values)
    324 {
    325   struct type *type;
    326 
    327   if (print_values == PRINT_NO_VALUES)
    328     return 0;
    329 
    330   if (print_values == PRINT_ALL_VALUES)
    331     return 1;
    332 
    333   if (varobj_is_dynamic_p (var))
    334     return 1;
    335 
    336   type = varobj_get_gdb_type (var);
    337   if (type == NULL)
    338     return 1;
    339   else
    340     {
    341       type = check_typedef (type);
    342 
    343       /* For PRINT_SIMPLE_VALUES, only print the value if it has a type
    344 	 and that type is not a compound type.  */
    345       return (TYPE_CODE (type) != TYPE_CODE_ARRAY
    346 	      && TYPE_CODE (type) != TYPE_CODE_STRUCT
    347 	      && TYPE_CODE (type) != TYPE_CODE_UNION);
    348     }
    349 }
    350 
    351 void
    352 mi_cmd_var_list_children (const char *command, char **argv, int argc)
    353 {
    354   struct ui_out *uiout = current_uiout;
    355   struct varobj *var;
    356   enum print_values print_values;
    357   int from, to;
    358 
    359   if (argc < 1 || argc > 4)
    360     error (_("-var-list-children: Usage: "
    361 	     "[PRINT_VALUES] NAME [FROM TO]"));
    362 
    363   /* Get varobj handle, if a valid var obj name was specified.  */
    364   if (argc == 1 || argc == 3)
    365     var = varobj_get_handle (argv[0]);
    366   else
    367     var = varobj_get_handle (argv[1]);
    368 
    369   if (argc > 2)
    370     {
    371       from = atoi (argv[argc - 2]);
    372       to = atoi (argv[argc - 1]);
    373     }
    374   else
    375     {
    376       from = -1;
    377       to = -1;
    378     }
    379 
    380   const std::vector<varobj *> &children
    381     = varobj_list_children (var, &from, &to);
    382 
    383   uiout->field_int ("numchild", to - from);
    384   if (argc == 2 || argc == 4)
    385     print_values = mi_parse_print_values (argv[0]);
    386   else
    387     print_values = PRINT_NO_VALUES;
    388 
    389   gdb::unique_xmalloc_ptr<char> display_hint = varobj_get_display_hint (var);
    390   if (display_hint)
    391     uiout->field_string ("displayhint", display_hint.get ());
    392 
    393   if (from < to)
    394     {
    395       /* For historical reasons this might emit a list or a tuple, so
    396 	 we construct one or the other.  */
    397       gdb::optional<ui_out_emit_tuple> tuple_emitter;
    398       gdb::optional<ui_out_emit_list> list_emitter;
    399 
    400       if (mi_version (uiout) == 1)
    401 	tuple_emitter.emplace (uiout, "children");
    402       else
    403 	list_emitter.emplace (uiout, "children");
    404       for (int ix = from; ix < to && ix < children.size (); ix++)
    405 	{
    406 	  ui_out_emit_tuple child_emitter (uiout, "child");
    407 
    408 	  print_varobj (children[ix], print_values, 1 /* print expression */);
    409 	}
    410     }
    411 
    412   uiout->field_int ("has_more", varobj_has_more (var, to));
    413 }
    414 
    415 void
    416 mi_cmd_var_info_type (const char *command, char **argv, int argc)
    417 {
    418   struct ui_out *uiout = current_uiout;
    419   struct varobj *var;
    420 
    421   if (argc != 1)
    422     error (_("-var-info-type: Usage: NAME."));
    423 
    424   /* Get varobj handle, if a valid var obj name was specified.  */
    425   var = varobj_get_handle (argv[0]);
    426 
    427   std::string type_name = varobj_get_type (var);
    428   uiout->field_string ("type", type_name.c_str ());
    429 }
    430 
    431 void
    432 mi_cmd_var_info_path_expression (const char *command, char **argv, int argc)
    433 {
    434   struct ui_out *uiout = current_uiout;
    435   struct varobj *var;
    436 
    437   if (argc != 1)
    438     error (_("Usage: NAME."));
    439 
    440   /* Get varobj handle, if a valid var obj name was specified.  */
    441   var = varobj_get_handle (argv[0]);
    442 
    443   const char *path_expr = varobj_get_path_expr (var);
    444 
    445   uiout->field_string ("path_expr", path_expr);
    446 }
    447 
    448 void
    449 mi_cmd_var_info_expression (const char *command, char **argv, int argc)
    450 {
    451   struct ui_out *uiout = current_uiout;
    452   const struct language_defn *lang;
    453   struct varobj *var;
    454 
    455   if (argc != 1)
    456     error (_("-var-info-expression: Usage: NAME."));
    457 
    458   /* Get varobj handle, if a valid var obj name was specified.  */
    459   var = varobj_get_handle (argv[0]);
    460 
    461   lang = varobj_get_language (var);
    462 
    463   uiout->field_string ("lang", lang->la_natural_name);
    464 
    465   std::string exp = varobj_get_expression (var);
    466   uiout->field_string ("exp", exp.c_str ());
    467 }
    468 
    469 void
    470 mi_cmd_var_show_attributes (const char *command, char **argv, int argc)
    471 {
    472   struct ui_out *uiout = current_uiout;
    473   int attr;
    474   const char *attstr;
    475   struct varobj *var;
    476 
    477   if (argc != 1)
    478     error (_("-var-show-attributes: Usage: NAME."));
    479 
    480   /* Get varobj handle, if a valid var obj name was specified */
    481   var = varobj_get_handle (argv[0]);
    482 
    483   attr = varobj_get_attributes (var);
    484   /* FIXME: define masks for attributes */
    485   if (attr & 0x00000001)
    486     attstr = "editable";
    487   else
    488     attstr = "noneditable";
    489 
    490   uiout->field_string ("attr", attstr);
    491 }
    492 
    493 void
    494 mi_cmd_var_evaluate_expression (const char *command, char **argv, int argc)
    495 {
    496   struct ui_out *uiout = current_uiout;
    497   struct varobj *var;
    498 
    499   enum varobj_display_formats format;
    500   int formatFound;
    501   int oind;
    502   char *oarg;
    503 
    504   enum opt
    505   {
    506     OP_FORMAT
    507   };
    508   static const struct mi_opt opts[] =
    509     {
    510       {"f", OP_FORMAT, 1},
    511       { 0, 0, 0 }
    512     };
    513 
    514   /* Parse arguments.  */
    515   format = FORMAT_NATURAL;
    516   formatFound = 0;
    517   oind = 0;
    518   while (1)
    519     {
    520       int opt = mi_getopt ("-var-evaluate-expression", argc, argv,
    521 			   opts, &oind, &oarg);
    522 
    523       if (opt < 0)
    524 	break;
    525       switch ((enum opt) opt)
    526 	{
    527 	case OP_FORMAT:
    528 	  if (formatFound)
    529 	    error (_("Cannot specify format more than once"));
    530 
    531 	  format = mi_parse_format (oarg);
    532 	  formatFound = 1;
    533 	  break;
    534 	}
    535     }
    536 
    537   if (oind >= argc)
    538     error (_("Usage: [-f FORMAT] NAME"));
    539 
    540   if (oind < argc - 1)
    541     error (_("Garbage at end of command"));
    542 
    543   /* Get varobj handle, if a valid var obj name was specified.  */
    544   var = varobj_get_handle (argv[oind]);
    545 
    546   if (formatFound)
    547     {
    548       std::string val = varobj_get_formatted_value (var, format);
    549 
    550       uiout->field_string ("value", val.c_str ());
    551     }
    552   else
    553     {
    554       std::string val = varobj_get_value (var);
    555 
    556       uiout->field_string ("value", val.c_str ());
    557     }
    558 }
    559 
    560 void
    561 mi_cmd_var_assign (const char *command, char **argv, int argc)
    562 {
    563   struct ui_out *uiout = current_uiout;
    564   struct varobj *var;
    565 
    566   if (argc != 2)
    567     error (_("-var-assign: Usage: NAME EXPRESSION."));
    568 
    569   /* Get varobj handle, if a valid var obj name was specified.  */
    570   var = varobj_get_handle (argv[0]);
    571 
    572   if (!varobj_editable_p (var))
    573     error (_("-var-assign: Variable object is not editable"));
    574 
    575   const char *expression = argv[1];
    576 
    577   /* MI command '-var-assign' may write memory, so suppress memory
    578      changed notification if it does.  */
    579   scoped_restore save_suppress
    580     = make_scoped_restore (&mi_suppress_notification.memory, 1);
    581 
    582   if (!varobj_set_value (var, expression))
    583     error (_("-var-assign: Could not assign "
    584 	     "expression to variable object"));
    585 
    586   std::string val = varobj_get_value (var);
    587   uiout->field_string ("value", val.c_str ());
    588 }
    589 
    590 /* Type used for parameters passing to mi_cmd_var_update_iter.  */
    591 
    592 struct mi_cmd_var_update
    593   {
    594     int only_floating;
    595     enum print_values print_values;
    596   };
    597 
    598 /* Helper for mi_cmd_var_update - update each VAR.  */
    599 
    600 static void
    601 mi_cmd_var_update_iter (struct varobj *var, void *data_pointer)
    602 {
    603   struct mi_cmd_var_update *data = (struct mi_cmd_var_update *) data_pointer;
    604   bool thread_stopped;
    605 
    606   int thread_id = varobj_get_thread_id (var);
    607 
    608   if (thread_id == -1)
    609     {
    610       thread_stopped = (inferior_ptid == null_ptid
    611 			|| inferior_thread ()->state == THREAD_STOPPED);
    612     }
    613   else
    614     {
    615       thread_info *tp = find_thread_global_id (thread_id);
    616 
    617       thread_stopped = (tp == NULL
    618 			|| tp->state == THREAD_STOPPED);
    619     }
    620 
    621   if (thread_stopped
    622       && (!data->only_floating || varobj_floating_p (var)))
    623     varobj_update_one (var, data->print_values, false /* implicit */);
    624 }
    625 
    626 void
    627 mi_cmd_var_update (const char *command, char **argv, int argc)
    628 {
    629   struct ui_out *uiout = current_uiout;
    630   char *name;
    631   enum print_values print_values;
    632 
    633   if (argc != 1 && argc != 2)
    634     error (_("-var-update: Usage: [PRINT_VALUES] NAME."));
    635 
    636   if (argc == 1)
    637     name = argv[0];
    638   else
    639     name = argv[1];
    640 
    641   if (argc == 2)
    642     print_values = mi_parse_print_values (argv[0]);
    643   else
    644     print_values = PRINT_NO_VALUES;
    645 
    646   /* For historical reasons this might emit a list or a tuple, so we
    647      construct one or the other.  */
    648   gdb::optional<ui_out_emit_tuple> tuple_emitter;
    649   gdb::optional<ui_out_emit_list> list_emitter;
    650 
    651   if (mi_version (uiout) <= 1)
    652     tuple_emitter.emplace (uiout, "changelist");
    653   else
    654     list_emitter.emplace (uiout, "changelist");
    655 
    656   /* Check if the parameter is a "*", which means that we want to
    657      update all variables.  */
    658 
    659   if ((*name == '*' || *name == '@') && (*(name + 1) == '\0'))
    660     {
    661       struct mi_cmd_var_update data;
    662 
    663       data.only_floating = (*name == '@');
    664       data.print_values = print_values;
    665 
    666       /* varobj_update_one automatically updates all the children of
    667 	 VAROBJ.  Therefore update each VAROBJ only once by iterating
    668 	 only the root VAROBJs.  */
    669 
    670       all_root_varobjs (mi_cmd_var_update_iter, &data);
    671     }
    672   else
    673     {
    674       /* Get varobj handle, if a valid var obj name was specified.  */
    675       struct varobj *var = varobj_get_handle (name);
    676 
    677       varobj_update_one (var, print_values, true /* explicit */);
    678     }
    679 }
    680 
    681 /* Helper for mi_cmd_var_update().  */
    682 
    683 static void
    684 varobj_update_one (struct varobj *var, enum print_values print_values,
    685 		   bool is_explicit)
    686 {
    687   struct ui_out *uiout = current_uiout;
    688 
    689   std::vector<varobj_update_result> changes = varobj_update (&var, is_explicit);
    690 
    691   for (const varobj_update_result &r : changes)
    692     {
    693       int from, to;
    694 
    695       gdb::optional<ui_out_emit_tuple> tuple_emitter;
    696       if (mi_version (uiout) > 1)
    697 	tuple_emitter.emplace (uiout, nullptr);
    698       uiout->field_string ("name", varobj_get_objname (r.varobj));
    699 
    700       switch (r.status)
    701 	{
    702 	case VAROBJ_IN_SCOPE:
    703 	  if (mi_print_value_p (r.varobj, print_values))
    704 	    {
    705 	      std::string val = varobj_get_value (r.varobj);
    706 
    707 	      uiout->field_string ("value", val.c_str ());
    708 	    }
    709 	  uiout->field_string ("in_scope", "true");
    710 	  break;
    711         case VAROBJ_NOT_IN_SCOPE:
    712           uiout->field_string ("in_scope", "false");
    713 	  break;
    714         case VAROBJ_INVALID:
    715           uiout->field_string ("in_scope", "invalid");
    716  	  break;
    717 	}
    718 
    719       if (r.status != VAROBJ_INVALID)
    720 	{
    721 	  if (r.type_changed)
    722 	    uiout->field_string ("type_changed", "true");
    723 	  else
    724 	    uiout->field_string ("type_changed", "false");
    725 	}
    726 
    727       if (r.type_changed)
    728 	{
    729 	  std::string type_name = varobj_get_type (r.varobj);
    730 
    731 	  uiout->field_string ("new_type", type_name.c_str ());
    732 	}
    733 
    734       if (r.type_changed || r.children_changed)
    735 	uiout->field_int ("new_num_children",
    736 			  varobj_get_num_children (r.varobj));
    737 
    738       gdb::unique_xmalloc_ptr<char> display_hint
    739 	= varobj_get_display_hint (r.varobj);
    740       if (display_hint)
    741 	uiout->field_string ("displayhint", display_hint.get ());
    742 
    743       if (varobj_is_dynamic_p (r.varobj))
    744 	uiout->field_int ("dynamic", 1);
    745 
    746       varobj_get_child_range (r.varobj, &from, &to);
    747       uiout->field_int ("has_more", varobj_has_more (r.varobj, to));
    748 
    749       if (!r.newobj.empty ())
    750 	{
    751 	  ui_out_emit_list list_emitter (uiout, "new_children");
    752 
    753 	  for (varobj *child : r.newobj)
    754 	    {
    755 	      ui_out_emit_tuple inner_tuple_emitter (uiout, NULL);
    756 	      print_varobj (child, print_values, 1 /* print_expression */);
    757 	    }
    758 	}
    759     }
    760 }
    761 
    762 void
    763 mi_cmd_enable_pretty_printing (const char *command, char **argv, int argc)
    764 {
    765   if (argc != 0)
    766     error (_("-enable-pretty-printing: no arguments allowed"));
    767 
    768   varobj_enable_pretty_printing ();
    769 }
    770 
    771 void
    772 mi_cmd_var_set_update_range (const char *command, char **argv, int argc)
    773 {
    774   struct varobj *var;
    775   int from, to;
    776 
    777   if (argc != 3)
    778     error (_("-var-set-update-range: Usage: VAROBJ FROM TO"));
    779 
    780   var = varobj_get_handle (argv[0]);
    781   from = atoi (argv[1]);
    782   to = atoi (argv[2]);
    783 
    784   varobj_set_child_range (var, from, to);
    785 }
    786