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