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