1b725ae77Skettenis /* MI Command Set - varobj commands.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 2000, 2002, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis Contributed by Cygnus Solutions (a Red Hat company).
6b725ae77Skettenis
7b725ae77Skettenis This file is part of GDB.
8b725ae77Skettenis
9b725ae77Skettenis This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis it under the terms of the GNU General Public License as published by
11b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis (at your option) any later version.
13b725ae77Skettenis
14b725ae77Skettenis This program is distributed in the hope that it will be useful,
15b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17b725ae77Skettenis GNU General Public License for more details.
18b725ae77Skettenis
19b725ae77Skettenis You should have received a copy of the GNU General Public License
20b725ae77Skettenis along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis Boston, MA 02111-1307, USA. */
23b725ae77Skettenis
24b725ae77Skettenis #include "defs.h"
25b725ae77Skettenis #include "mi-cmds.h"
26b725ae77Skettenis #include "ui-out.h"
27b725ae77Skettenis #include "mi-out.h"
28b725ae77Skettenis #include "varobj.h"
29b725ae77Skettenis #include "value.h"
30b725ae77Skettenis #include <ctype.h>
31b725ae77Skettenis #include "gdb_string.h"
32b725ae77Skettenis
33b725ae77Skettenis extern int varobjdebug; /* defined in varobj.c */
34b725ae77Skettenis
35b725ae77Skettenis static int varobj_update_one (struct varobj *var);
36b725ae77Skettenis
37b725ae77Skettenis /* VAROBJ operations */
38b725ae77Skettenis
39b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_create(char * command,char ** argv,int argc)40b725ae77Skettenis mi_cmd_var_create (char *command, char **argv, int argc)
41b725ae77Skettenis {
42b725ae77Skettenis CORE_ADDR frameaddr = 0;
43b725ae77Skettenis struct varobj *var;
44b725ae77Skettenis char *name;
45b725ae77Skettenis char *frame;
46b725ae77Skettenis char *expr;
47b725ae77Skettenis char *type;
48b725ae77Skettenis struct cleanup *old_cleanups;
49b725ae77Skettenis enum varobj_type var_type;
50b725ae77Skettenis
51b725ae77Skettenis if (argc != 3)
52b725ae77Skettenis {
53*11efff7fSkettenis /* mi_error_message = xstrprintf ("mi_cmd_var_create: Usage:
54*11efff7fSkettenis ...."); return MI_CMD_ERROR; */
55b725ae77Skettenis error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
56b725ae77Skettenis }
57b725ae77Skettenis
58b725ae77Skettenis name = xstrdup (argv[0]);
59b725ae77Skettenis /* Add cleanup for name. Must be free_current_contents as
60b725ae77Skettenis name can be reallocated */
61b725ae77Skettenis old_cleanups = make_cleanup (free_current_contents, &name);
62b725ae77Skettenis
63b725ae77Skettenis frame = xstrdup (argv[1]);
64b725ae77Skettenis old_cleanups = make_cleanup (xfree, frame);
65b725ae77Skettenis
66b725ae77Skettenis expr = xstrdup (argv[2]);
67b725ae77Skettenis
68b725ae77Skettenis if (strcmp (name, "-") == 0)
69b725ae77Skettenis {
70b725ae77Skettenis xfree (name);
71b725ae77Skettenis name = varobj_gen_name ();
72b725ae77Skettenis }
73b725ae77Skettenis else if (!isalpha (*name))
74b725ae77Skettenis error ("mi_cmd_var_create: name of object must begin with a letter");
75b725ae77Skettenis
76b725ae77Skettenis if (strcmp (frame, "*") == 0)
77b725ae77Skettenis var_type = USE_CURRENT_FRAME;
78b725ae77Skettenis else if (strcmp (frame, "@") == 0)
79b725ae77Skettenis var_type = USE_SELECTED_FRAME;
80b725ae77Skettenis else
81b725ae77Skettenis {
82b725ae77Skettenis var_type = USE_SPECIFIED_FRAME;
83b725ae77Skettenis frameaddr = string_to_core_addr (frame);
84b725ae77Skettenis }
85b725ae77Skettenis
86b725ae77Skettenis if (varobjdebug)
87b725ae77Skettenis fprintf_unfiltered (gdb_stdlog,
88b725ae77Skettenis "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
89b725ae77Skettenis name, frame, paddr (frameaddr), expr);
90b725ae77Skettenis
91b725ae77Skettenis var = varobj_create (name, expr, frameaddr, var_type);
92b725ae77Skettenis
93b725ae77Skettenis if (var == NULL)
94b725ae77Skettenis error ("mi_cmd_var_create: unable to create variable object");
95b725ae77Skettenis
96b725ae77Skettenis ui_out_field_string (uiout, "name", name);
97b725ae77Skettenis ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
98b725ae77Skettenis type = varobj_get_type (var);
99b725ae77Skettenis if (type == NULL)
100b725ae77Skettenis ui_out_field_string (uiout, "type", "");
101b725ae77Skettenis else
102b725ae77Skettenis {
103b725ae77Skettenis ui_out_field_string (uiout, "type", type);
104b725ae77Skettenis xfree (type);
105b725ae77Skettenis }
106b725ae77Skettenis
107b725ae77Skettenis do_cleanups (old_cleanups);
108b725ae77Skettenis return MI_CMD_DONE;
109b725ae77Skettenis }
110b725ae77Skettenis
111b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_delete(char * command,char ** argv,int argc)112b725ae77Skettenis mi_cmd_var_delete (char *command, char **argv, int argc)
113b725ae77Skettenis {
114b725ae77Skettenis char *name;
115b725ae77Skettenis char *expr;
116b725ae77Skettenis struct varobj *var;
117b725ae77Skettenis int numdel;
118b725ae77Skettenis int children_only_p = 0;
119b725ae77Skettenis struct cleanup *old_cleanups;
120b725ae77Skettenis
121b725ae77Skettenis if (argc < 1 || argc > 2)
122b725ae77Skettenis error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION.");
123b725ae77Skettenis
124b725ae77Skettenis name = xstrdup (argv[0]);
125b725ae77Skettenis /* Add cleanup for name. Must be free_current_contents as
126b725ae77Skettenis name can be reallocated */
127b725ae77Skettenis old_cleanups = make_cleanup (free_current_contents, &name);
128b725ae77Skettenis
129b725ae77Skettenis /* If we have one single argument it cannot be '-c' or any string
130b725ae77Skettenis starting with '-'. */
131b725ae77Skettenis if (argc == 1)
132b725ae77Skettenis {
133b725ae77Skettenis if (strcmp (name, "-c") == 0)
134b725ae77Skettenis error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name");
135b725ae77Skettenis if (*name == '-')
136b725ae77Skettenis error ("mi_cmd_var_delete: Illegal variable object name");
137b725ae77Skettenis }
138b725ae77Skettenis
139b725ae77Skettenis /* If we have 2 arguments they must be '-c' followed by a string
140b725ae77Skettenis which would be the variable name. */
141b725ae77Skettenis if (argc == 2)
142b725ae77Skettenis {
143b725ae77Skettenis expr = xstrdup (argv[1]);
144b725ae77Skettenis if (strcmp (name, "-c") != 0)
145b725ae77Skettenis error ("mi_cmd_var_delete: Invalid option.");
146b725ae77Skettenis children_only_p = 1;
147b725ae77Skettenis xfree (name);
148b725ae77Skettenis name = xstrdup (expr);
149b725ae77Skettenis xfree (expr);
150b725ae77Skettenis }
151b725ae77Skettenis
152b725ae77Skettenis /* If we didn't error out, now NAME contains the name of the
153b725ae77Skettenis variable. */
154b725ae77Skettenis
155b725ae77Skettenis var = varobj_get_handle (name);
156b725ae77Skettenis
157b725ae77Skettenis if (var == NULL)
158b725ae77Skettenis error ("mi_cmd_var_delete: Variable object not found.");
159b725ae77Skettenis
160b725ae77Skettenis numdel = varobj_delete (var, NULL, children_only_p);
161b725ae77Skettenis
162b725ae77Skettenis ui_out_field_int (uiout, "ndeleted", numdel);
163b725ae77Skettenis
164b725ae77Skettenis do_cleanups (old_cleanups);
165b725ae77Skettenis return MI_CMD_DONE;
166b725ae77Skettenis }
167b725ae77Skettenis
168b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_set_format(char * command,char ** argv,int argc)169b725ae77Skettenis mi_cmd_var_set_format (char *command, char **argv, int argc)
170b725ae77Skettenis {
171b725ae77Skettenis enum varobj_display_formats format;
172b725ae77Skettenis int len;
173b725ae77Skettenis struct varobj *var;
174b725ae77Skettenis char *formspec;
175b725ae77Skettenis
176b725ae77Skettenis if (argc != 2)
177b725ae77Skettenis error ("mi_cmd_var_set_format: Usage: NAME FORMAT.");
178b725ae77Skettenis
179b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
180b725ae77Skettenis var = varobj_get_handle (argv[0]);
181b725ae77Skettenis
182b725ae77Skettenis if (var == NULL)
183b725ae77Skettenis error ("mi_cmd_var_set_format: Variable object not found");
184b725ae77Skettenis
185b725ae77Skettenis formspec = xstrdup (argv[1]);
186b725ae77Skettenis if (formspec == NULL)
187b725ae77Skettenis error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
188b725ae77Skettenis
189b725ae77Skettenis len = strlen (formspec);
190b725ae77Skettenis
191b725ae77Skettenis if (strncmp (formspec, "natural", len) == 0)
192b725ae77Skettenis format = FORMAT_NATURAL;
193b725ae77Skettenis else if (strncmp (formspec, "binary", len) == 0)
194b725ae77Skettenis format = FORMAT_BINARY;
195b725ae77Skettenis else if (strncmp (formspec, "decimal", len) == 0)
196b725ae77Skettenis format = FORMAT_DECIMAL;
197b725ae77Skettenis else if (strncmp (formspec, "hexadecimal", len) == 0)
198b725ae77Skettenis format = FORMAT_HEXADECIMAL;
199b725ae77Skettenis else if (strncmp (formspec, "octal", len) == 0)
200b725ae77Skettenis format = FORMAT_OCTAL;
201b725ae77Skettenis else
202b725ae77Skettenis error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
203b725ae77Skettenis
204b725ae77Skettenis /* Set the format of VAR to given format */
205b725ae77Skettenis varobj_set_display_format (var, format);
206b725ae77Skettenis
207b725ae77Skettenis /* Report the new current format */
208b725ae77Skettenis ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
209b725ae77Skettenis return MI_CMD_DONE;
210b725ae77Skettenis }
211b725ae77Skettenis
212b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_show_format(char * command,char ** argv,int argc)213b725ae77Skettenis mi_cmd_var_show_format (char *command, char **argv, int argc)
214b725ae77Skettenis {
215b725ae77Skettenis enum varobj_display_formats format;
216b725ae77Skettenis struct varobj *var;
217b725ae77Skettenis
218b725ae77Skettenis if (argc != 1)
219b725ae77Skettenis error ("mi_cmd_var_show_format: Usage: NAME.");
220b725ae77Skettenis
221b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
222b725ae77Skettenis var = varobj_get_handle (argv[0]);
223b725ae77Skettenis if (var == NULL)
224b725ae77Skettenis error ("mi_cmd_var_show_format: Variable object not found");
225b725ae77Skettenis
226b725ae77Skettenis format = varobj_get_display_format (var);
227b725ae77Skettenis
228b725ae77Skettenis /* Report the current format */
229b725ae77Skettenis ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
230b725ae77Skettenis return MI_CMD_DONE;
231b725ae77Skettenis }
232b725ae77Skettenis
233b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_info_num_children(char * command,char ** argv,int argc)234b725ae77Skettenis mi_cmd_var_info_num_children (char *command, char **argv, int argc)
235b725ae77Skettenis {
236b725ae77Skettenis struct varobj *var;
237b725ae77Skettenis
238b725ae77Skettenis if (argc != 1)
239b725ae77Skettenis error ("mi_cmd_var_info_num_children: Usage: NAME.");
240b725ae77Skettenis
241b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
242b725ae77Skettenis var = varobj_get_handle (argv[0]);
243b725ae77Skettenis if (var == NULL)
244b725ae77Skettenis error ("mi_cmd_var_info_num_children: Variable object not found");
245b725ae77Skettenis
246b725ae77Skettenis ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
247b725ae77Skettenis return MI_CMD_DONE;
248b725ae77Skettenis }
249b725ae77Skettenis
250b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_list_children(char * command,char ** argv,int argc)251b725ae77Skettenis mi_cmd_var_list_children (char *command, char **argv, int argc)
252b725ae77Skettenis {
253b725ae77Skettenis struct varobj *var;
254b725ae77Skettenis struct varobj **childlist;
255b725ae77Skettenis struct varobj **cc;
256b725ae77Skettenis struct cleanup *cleanup_children;
257b725ae77Skettenis int numchild;
258b725ae77Skettenis char *type;
259b725ae77Skettenis enum print_values print_values;
260b725ae77Skettenis
261b725ae77Skettenis if (argc != 1 && argc != 2)
262b725ae77Skettenis error ("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME");
263b725ae77Skettenis
264b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
265b725ae77Skettenis if (argc == 1) var = varobj_get_handle (argv[0]);
266b725ae77Skettenis else var = varobj_get_handle (argv[1]);
267b725ae77Skettenis if (var == NULL)
268b725ae77Skettenis error ("Variable object not found");
269b725ae77Skettenis
270b725ae77Skettenis numchild = varobj_list_children (var, &childlist);
271b725ae77Skettenis ui_out_field_int (uiout, "numchild", numchild);
272b725ae77Skettenis if (argc == 2)
273b725ae77Skettenis if (strcmp (argv[0], "0") == 0
274b725ae77Skettenis || strcmp (argv[0], "--no-values") == 0)
275b725ae77Skettenis print_values = PRINT_NO_VALUES;
276b725ae77Skettenis else if (strcmp (argv[0], "1") == 0
277b725ae77Skettenis || strcmp (argv[0], "--all-values") == 0)
278b725ae77Skettenis print_values = PRINT_ALL_VALUES;
279b725ae77Skettenis else
280b725ae77Skettenis error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\"");
281b725ae77Skettenis else print_values = PRINT_NO_VALUES;
282b725ae77Skettenis
283b725ae77Skettenis if (numchild <= 0)
284b725ae77Skettenis return MI_CMD_DONE;
285b725ae77Skettenis
286b725ae77Skettenis if (mi_version (uiout) == 1)
287b725ae77Skettenis cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children");
288b725ae77Skettenis else
289b725ae77Skettenis cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children");
290b725ae77Skettenis cc = childlist;
291b725ae77Skettenis while (*cc != NULL)
292b725ae77Skettenis {
293b725ae77Skettenis struct cleanup *cleanup_child;
294b725ae77Skettenis cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child");
295b725ae77Skettenis ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
296b725ae77Skettenis ui_out_field_string (uiout, "exp", varobj_get_expression (*cc));
297b725ae77Skettenis ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc));
298b725ae77Skettenis if (print_values)
299b725ae77Skettenis ui_out_field_string (uiout, "value", varobj_get_value (*cc));
300b725ae77Skettenis type = varobj_get_type (*cc);
301b725ae77Skettenis /* C++ pseudo-variables (public, private, protected) do not have a type */
302b725ae77Skettenis if (type)
303b725ae77Skettenis ui_out_field_string (uiout, "type", varobj_get_type (*cc));
304b725ae77Skettenis do_cleanups (cleanup_child);
305b725ae77Skettenis cc++;
306b725ae77Skettenis }
307b725ae77Skettenis do_cleanups (cleanup_children);
308b725ae77Skettenis xfree (childlist);
309b725ae77Skettenis return MI_CMD_DONE;
310b725ae77Skettenis }
311b725ae77Skettenis
312b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_info_type(char * command,char ** argv,int argc)313b725ae77Skettenis mi_cmd_var_info_type (char *command, char **argv, int argc)
314b725ae77Skettenis {
315b725ae77Skettenis struct varobj *var;
316b725ae77Skettenis
317b725ae77Skettenis if (argc != 1)
318b725ae77Skettenis error ("mi_cmd_var_info_type: Usage: NAME.");
319b725ae77Skettenis
320b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
321b725ae77Skettenis var = varobj_get_handle (argv[0]);
322b725ae77Skettenis if (var == NULL)
323b725ae77Skettenis error ("mi_cmd_var_info_type: Variable object not found");
324b725ae77Skettenis
325b725ae77Skettenis ui_out_field_string (uiout, "type", varobj_get_type (var));
326b725ae77Skettenis return MI_CMD_DONE;
327b725ae77Skettenis }
328b725ae77Skettenis
329b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_info_expression(char * command,char ** argv,int argc)330b725ae77Skettenis mi_cmd_var_info_expression (char *command, char **argv, int argc)
331b725ae77Skettenis {
332b725ae77Skettenis enum varobj_languages lang;
333b725ae77Skettenis struct varobj *var;
334b725ae77Skettenis
335b725ae77Skettenis if (argc != 1)
336b725ae77Skettenis error ("mi_cmd_var_info_expression: Usage: NAME.");
337b725ae77Skettenis
338b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
339b725ae77Skettenis var = varobj_get_handle (argv[0]);
340b725ae77Skettenis if (var == NULL)
341b725ae77Skettenis error ("mi_cmd_var_info_expression: Variable object not found");
342b725ae77Skettenis
343b725ae77Skettenis lang = varobj_get_language (var);
344b725ae77Skettenis
345b725ae77Skettenis ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]);
346b725ae77Skettenis ui_out_field_string (uiout, "exp", varobj_get_expression (var));
347b725ae77Skettenis return MI_CMD_DONE;
348b725ae77Skettenis }
349b725ae77Skettenis
350b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_show_attributes(char * command,char ** argv,int argc)351b725ae77Skettenis mi_cmd_var_show_attributes (char *command, char **argv, int argc)
352b725ae77Skettenis {
353b725ae77Skettenis int attr;
354b725ae77Skettenis char *attstr;
355b725ae77Skettenis struct varobj *var;
356b725ae77Skettenis
357b725ae77Skettenis if (argc != 1)
358b725ae77Skettenis error ("mi_cmd_var_show_attributes: Usage: NAME.");
359b725ae77Skettenis
360b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
361b725ae77Skettenis var = varobj_get_handle (argv[0]);
362b725ae77Skettenis if (var == NULL)
363b725ae77Skettenis error ("mi_cmd_var_show_attributes: Variable object not found");
364b725ae77Skettenis
365b725ae77Skettenis attr = varobj_get_attributes (var);
366b725ae77Skettenis /* FIXME: define masks for attributes */
367b725ae77Skettenis if (attr & 0x00000001)
368b725ae77Skettenis attstr = "editable";
369b725ae77Skettenis else
370b725ae77Skettenis attstr = "noneditable";
371b725ae77Skettenis
372b725ae77Skettenis ui_out_field_string (uiout, "attr", attstr);
373b725ae77Skettenis return MI_CMD_DONE;
374b725ae77Skettenis }
375b725ae77Skettenis
376b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_evaluate_expression(char * command,char ** argv,int argc)377b725ae77Skettenis mi_cmd_var_evaluate_expression (char *command, char **argv, int argc)
378b725ae77Skettenis {
379b725ae77Skettenis struct varobj *var;
380b725ae77Skettenis
381b725ae77Skettenis if (argc != 1)
382b725ae77Skettenis error ("mi_cmd_var_evaluate_expression: Usage: NAME.");
383b725ae77Skettenis
384b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
385b725ae77Skettenis var = varobj_get_handle (argv[0]);
386b725ae77Skettenis if (var == NULL)
387b725ae77Skettenis error ("mi_cmd_var_evaluate_expression: Variable object not found");
388b725ae77Skettenis
389b725ae77Skettenis ui_out_field_string (uiout, "value", varobj_get_value (var));
390b725ae77Skettenis return MI_CMD_DONE;
391b725ae77Skettenis }
392b725ae77Skettenis
393b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_assign(char * command,char ** argv,int argc)394b725ae77Skettenis mi_cmd_var_assign (char *command, char **argv, int argc)
395b725ae77Skettenis {
396b725ae77Skettenis struct varobj *var;
397b725ae77Skettenis char *expression;
398b725ae77Skettenis
399b725ae77Skettenis if (argc != 2)
400b725ae77Skettenis error ("mi_cmd_var_assign: Usage: NAME EXPRESSION.");
401b725ae77Skettenis
402b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
403b725ae77Skettenis var = varobj_get_handle (argv[0]);
404b725ae77Skettenis if (var == NULL)
405b725ae77Skettenis error ("mi_cmd_var_assign: Variable object not found");
406b725ae77Skettenis
407b725ae77Skettenis /* FIXME: define masks for attributes */
408b725ae77Skettenis if (!(varobj_get_attributes (var) & 0x00000001))
409b725ae77Skettenis error ("mi_cmd_var_assign: Variable object is not editable");
410b725ae77Skettenis
411b725ae77Skettenis expression = xstrdup (argv[1]);
412b725ae77Skettenis
413b725ae77Skettenis if (!varobj_set_value (var, expression))
414b725ae77Skettenis error ("mi_cmd_var_assign: Could not assign expression to varible object");
415b725ae77Skettenis
416b725ae77Skettenis ui_out_field_string (uiout, "value", varobj_get_value (var));
417b725ae77Skettenis return MI_CMD_DONE;
418b725ae77Skettenis }
419b725ae77Skettenis
420b725ae77Skettenis enum mi_cmd_result
mi_cmd_var_update(char * command,char ** argv,int argc)421b725ae77Skettenis mi_cmd_var_update (char *command, char **argv, int argc)
422b725ae77Skettenis {
423b725ae77Skettenis struct varobj *var;
424b725ae77Skettenis struct varobj **rootlist;
425b725ae77Skettenis struct varobj **cr;
426b725ae77Skettenis struct cleanup *cleanup;
427b725ae77Skettenis char *name;
428b725ae77Skettenis int nv;
429b725ae77Skettenis
430b725ae77Skettenis if (argc != 1)
431b725ae77Skettenis error ("mi_cmd_var_update: Usage: NAME.");
432b725ae77Skettenis
433b725ae77Skettenis name = argv[0];
434b725ae77Skettenis
435b725ae77Skettenis /* Check if the parameter is a "*" which means that we want
436b725ae77Skettenis to update all variables */
437b725ae77Skettenis
438b725ae77Skettenis if ((*name == '*') && (*(name + 1) == '\0'))
439b725ae77Skettenis {
440b725ae77Skettenis nv = varobj_list (&rootlist);
441b725ae77Skettenis if (mi_version (uiout) <= 1)
442b725ae77Skettenis cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
443b725ae77Skettenis else
444b725ae77Skettenis cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
445b725ae77Skettenis if (nv <= 0)
446b725ae77Skettenis {
447b725ae77Skettenis do_cleanups (cleanup);
448b725ae77Skettenis return MI_CMD_DONE;
449b725ae77Skettenis }
450b725ae77Skettenis cr = rootlist;
451b725ae77Skettenis while (*cr != NULL)
452b725ae77Skettenis {
453b725ae77Skettenis varobj_update_one (*cr);
454b725ae77Skettenis cr++;
455b725ae77Skettenis }
456b725ae77Skettenis xfree (rootlist);
457b725ae77Skettenis do_cleanups (cleanup);
458b725ae77Skettenis }
459b725ae77Skettenis else
460b725ae77Skettenis {
461b725ae77Skettenis /* Get varobj handle, if a valid var obj name was specified */
462b725ae77Skettenis var = varobj_get_handle (name);
463b725ae77Skettenis if (var == NULL)
464b725ae77Skettenis error ("mi_cmd_var_update: Variable object not found");
465b725ae77Skettenis
466b725ae77Skettenis if (mi_version (uiout) <= 1)
467b725ae77Skettenis cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
468b725ae77Skettenis else
469b725ae77Skettenis cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
470b725ae77Skettenis varobj_update_one (var);
471b725ae77Skettenis do_cleanups (cleanup);
472b725ae77Skettenis }
473b725ae77Skettenis return MI_CMD_DONE;
474b725ae77Skettenis }
475b725ae77Skettenis
476b725ae77Skettenis /* Helper for mi_cmd_var_update() Returns 0 if the update for
477b725ae77Skettenis the variable fails (usually because the variable is out of
478b725ae77Skettenis scope), and 1 if it succeeds. */
479b725ae77Skettenis
480b725ae77Skettenis static int
varobj_update_one(struct varobj * var)481b725ae77Skettenis varobj_update_one (struct varobj *var)
482b725ae77Skettenis {
483b725ae77Skettenis struct varobj **changelist;
484b725ae77Skettenis struct varobj **cc;
485b725ae77Skettenis struct cleanup *cleanup = NULL;
486b725ae77Skettenis int nc;
487b725ae77Skettenis
488b725ae77Skettenis nc = varobj_update (&var, &changelist);
489b725ae77Skettenis
490b725ae77Skettenis /* nc == 0 means that nothing has changed.
491b725ae77Skettenis nc == -1 means that an error occured in updating the variable.
492b725ae77Skettenis nc == -2 means the variable has changed type. */
493b725ae77Skettenis
494b725ae77Skettenis if (nc == 0)
495b725ae77Skettenis return 1;
496b725ae77Skettenis else if (nc == -1)
497b725ae77Skettenis {
498b725ae77Skettenis if (mi_version (uiout) > 1)
499b725ae77Skettenis cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
500b725ae77Skettenis ui_out_field_string (uiout, "name", varobj_get_objname(var));
501b725ae77Skettenis ui_out_field_string (uiout, "in_scope", "false");
502b725ae77Skettenis if (mi_version (uiout) > 1)
503b725ae77Skettenis do_cleanups (cleanup);
504b725ae77Skettenis return -1;
505b725ae77Skettenis }
506b725ae77Skettenis else if (nc == -2)
507b725ae77Skettenis {
508b725ae77Skettenis if (mi_version (uiout) > 1)
509b725ae77Skettenis cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
510b725ae77Skettenis ui_out_field_string (uiout, "name", varobj_get_objname (var));
511b725ae77Skettenis ui_out_field_string (uiout, "in_scope", "true");
512b725ae77Skettenis ui_out_field_string (uiout, "new_type", varobj_get_type(var));
513b725ae77Skettenis ui_out_field_int (uiout, "new_num_children",
514b725ae77Skettenis varobj_get_num_children(var));
515b725ae77Skettenis if (mi_version (uiout) > 1)
516b725ae77Skettenis do_cleanups (cleanup);
517b725ae77Skettenis }
518b725ae77Skettenis else
519b725ae77Skettenis {
520b725ae77Skettenis
521b725ae77Skettenis cc = changelist;
522b725ae77Skettenis while (*cc != NULL)
523b725ae77Skettenis {
524b725ae77Skettenis if (mi_version (uiout) > 1)
525b725ae77Skettenis cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
526b725ae77Skettenis ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
527b725ae77Skettenis ui_out_field_string (uiout, "in_scope", "true");
528b725ae77Skettenis ui_out_field_string (uiout, "type_changed", "false");
529b725ae77Skettenis if (mi_version (uiout) > 1)
530b725ae77Skettenis do_cleanups (cleanup);
531b725ae77Skettenis cc++;
532b725ae77Skettenis }
533b725ae77Skettenis xfree (changelist);
534b725ae77Skettenis return 1;
535b725ae77Skettenis }
536b725ae77Skettenis return 1;
537b725ae77Skettenis }
538