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