198944Sobrien/* MI Command Set - varobj commands.
2130803Smarcel
3130803Smarcel   Copyright 2000, 2002, 2004 Free Software Foundation, Inc.
4130803Smarcel
598944Sobrien   Contributed by Cygnus Solutions (a Red Hat company).
698944Sobrien
798944Sobrien   This file is part of GDB.
898944Sobrien
998944Sobrien   This program is free software; you can redistribute it and/or modify
1098944Sobrien   it under the terms of the GNU General Public License as published by
1198944Sobrien   the Free Software Foundation; either version 2 of the License, or
1298944Sobrien   (at your option) any later version.
1398944Sobrien
1498944Sobrien   This program is distributed in the hope that it will be useful,
1598944Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1698944Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1798944Sobrien   GNU General Public License for more details.
1898944Sobrien
1998944Sobrien   You should have received a copy of the GNU General Public License
2098944Sobrien   along with this program; if not, write to the Free Software
2198944Sobrien   Foundation, Inc., 59 Temple Place - Suite 330,
2298944Sobrien   Boston, MA 02111-1307, USA.  */
2398944Sobrien
2498944Sobrien#include "defs.h"
2598944Sobrien#include "mi-cmds.h"
2698944Sobrien#include "ui-out.h"
2798944Sobrien#include "mi-out.h"
2898944Sobrien#include "varobj.h"
2998944Sobrien#include "value.h"
3098944Sobrien#include <ctype.h>
31130803Smarcel#include "gdb_string.h"
3298944Sobrien
3398944Sobrienextern int varobjdebug;		/* defined in varobj.c */
3498944Sobrien
3598944Sobrienstatic int varobj_update_one (struct varobj *var);
3698944Sobrien
3798944Sobrien/* VAROBJ operations */
3898944Sobrien
3998944Sobrienenum mi_cmd_result
4098944Sobrienmi_cmd_var_create (char *command, char **argv, int argc)
4198944Sobrien{
4298944Sobrien  CORE_ADDR frameaddr = 0;
4398944Sobrien  struct varobj *var;
4498944Sobrien  char *name;
4598944Sobrien  char *frame;
4698944Sobrien  char *expr;
4798944Sobrien  char *type;
4898944Sobrien  struct cleanup *old_cleanups;
4998944Sobrien  enum varobj_type var_type;
5098944Sobrien
5198944Sobrien  if (argc != 3)
5298944Sobrien    {
5398944Sobrien      /*      xasprintf (&mi_error_message,
5498944Sobrien         "mi_cmd_var_create: Usage: .");
5598944Sobrien         return MI_CMD_ERROR; */
5698944Sobrien      error ("mi_cmd_var_create: Usage: NAME FRAME EXPRESSION.");
5798944Sobrien    }
5898944Sobrien
5998944Sobrien  name = xstrdup (argv[0]);
6098944Sobrien  /* Add cleanup for name. Must be free_current_contents as
6198944Sobrien     name can be reallocated */
6298944Sobrien  old_cleanups = make_cleanup (free_current_contents, &name);
6398944Sobrien
6498944Sobrien  frame = xstrdup (argv[1]);
6598944Sobrien  old_cleanups = make_cleanup (xfree, frame);
6698944Sobrien
6798944Sobrien  expr = xstrdup (argv[2]);
6898944Sobrien
6998944Sobrien  if (strcmp (name, "-") == 0)
7098944Sobrien    {
7198944Sobrien      xfree (name);
7298944Sobrien      name = varobj_gen_name ();
7398944Sobrien    }
7498944Sobrien  else if (!isalpha (*name))
7598944Sobrien    error ("mi_cmd_var_create: name of object must begin with a letter");
7698944Sobrien
7798944Sobrien  if (strcmp (frame, "*") == 0)
7898944Sobrien    var_type = USE_CURRENT_FRAME;
7998944Sobrien  else if (strcmp (frame, "@") == 0)
8098944Sobrien    var_type = USE_SELECTED_FRAME;
8198944Sobrien  else
8298944Sobrien    {
8398944Sobrien      var_type = USE_SPECIFIED_FRAME;
84130803Smarcel      frameaddr = string_to_core_addr (frame);
8598944Sobrien    }
8698944Sobrien
8798944Sobrien  if (varobjdebug)
8898944Sobrien    fprintf_unfiltered (gdb_stdlog,
8998944Sobrien		    "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
9098944Sobrien			name, frame, paddr (frameaddr), expr);
9198944Sobrien
9298944Sobrien  var = varobj_create (name, expr, frameaddr, var_type);
9398944Sobrien
9498944Sobrien  if (var == NULL)
9598944Sobrien    error ("mi_cmd_var_create: unable to create variable object");
9698944Sobrien
9798944Sobrien  ui_out_field_string (uiout, "name", name);
9898944Sobrien  ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
9998944Sobrien  type = varobj_get_type (var);
10098944Sobrien  if (type == NULL)
10198944Sobrien    ui_out_field_string (uiout, "type", "");
10298944Sobrien  else
10398944Sobrien    {
10498944Sobrien      ui_out_field_string (uiout, "type", type);
10598944Sobrien      xfree (type);
10698944Sobrien    }
10798944Sobrien
10898944Sobrien  do_cleanups (old_cleanups);
10998944Sobrien  return MI_CMD_DONE;
11098944Sobrien}
11198944Sobrien
11298944Sobrienenum mi_cmd_result
11398944Sobrienmi_cmd_var_delete (char *command, char **argv, int argc)
11498944Sobrien{
11598944Sobrien  char *name;
11698944Sobrien  char *expr;
11798944Sobrien  struct varobj *var;
11898944Sobrien  int numdel;
11998944Sobrien  int children_only_p = 0;
12098944Sobrien  struct cleanup *old_cleanups;
12198944Sobrien
12298944Sobrien  if (argc < 1 || argc > 2)
12398944Sobrien    error ("mi_cmd_var_delete: Usage: [-c] EXPRESSION.");
12498944Sobrien
12598944Sobrien  name = xstrdup (argv[0]);
12698944Sobrien  /* Add cleanup for name. Must be free_current_contents as
12798944Sobrien     name can be reallocated */
12898944Sobrien  old_cleanups = make_cleanup (free_current_contents, &name);
12998944Sobrien
13098944Sobrien  /* If we have one single argument it cannot be '-c' or any string
13198944Sobrien     starting with '-'. */
13298944Sobrien  if (argc == 1)
13398944Sobrien    {
13498944Sobrien      if (strcmp (name, "-c") == 0)
13598944Sobrien	error ("mi_cmd_var_delete: Missing required argument after '-c': variable object name");
13698944Sobrien      if (*name == '-')
13798944Sobrien	error ("mi_cmd_var_delete: Illegal variable object name");
13898944Sobrien    }
13998944Sobrien
14098944Sobrien  /* If we have 2 arguments they must be '-c' followed by a string
14198944Sobrien     which would be the variable name. */
14298944Sobrien  if (argc == 2)
14398944Sobrien    {
14498944Sobrien      expr = xstrdup (argv[1]);
14598944Sobrien      if (strcmp (name, "-c") != 0)
14698944Sobrien	error ("mi_cmd_var_delete: Invalid option.");
14798944Sobrien      children_only_p = 1;
14898944Sobrien      xfree (name);
14998944Sobrien      name = xstrdup (expr);
15098944Sobrien      xfree (expr);
15198944Sobrien    }
15298944Sobrien
15398944Sobrien  /* If we didn't error out, now NAME contains the name of the
15498944Sobrien     variable. */
15598944Sobrien
15698944Sobrien  var = varobj_get_handle (name);
15798944Sobrien
15898944Sobrien  if (var == NULL)
15998944Sobrien    error ("mi_cmd_var_delete: Variable object not found.");
16098944Sobrien
16198944Sobrien  numdel = varobj_delete (var, NULL, children_only_p);
16298944Sobrien
16398944Sobrien  ui_out_field_int (uiout, "ndeleted", numdel);
16498944Sobrien
16598944Sobrien  do_cleanups (old_cleanups);
16698944Sobrien  return MI_CMD_DONE;
16798944Sobrien}
16898944Sobrien
16998944Sobrienenum mi_cmd_result
17098944Sobrienmi_cmd_var_set_format (char *command, char **argv, int argc)
17198944Sobrien{
17298944Sobrien  enum varobj_display_formats format;
17398944Sobrien  int len;
17498944Sobrien  struct varobj *var;
17598944Sobrien  char *formspec;
17698944Sobrien
17798944Sobrien  if (argc != 2)
17898944Sobrien    error ("mi_cmd_var_set_format: Usage: NAME FORMAT.");
17998944Sobrien
18098944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
18198944Sobrien  var = varobj_get_handle (argv[0]);
18298944Sobrien
18398944Sobrien  if (var == NULL)
18498944Sobrien    error ("mi_cmd_var_set_format: Variable object not found");
18598944Sobrien
18698944Sobrien  formspec = xstrdup (argv[1]);
18798944Sobrien  if (formspec == NULL)
18898944Sobrien    error ("mi_cmd_var_set_format: Must specify the format as: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
18998944Sobrien
19098944Sobrien  len = strlen (formspec);
19198944Sobrien
192130803Smarcel  if (strncmp (formspec, "natural", len) == 0)
19398944Sobrien    format = FORMAT_NATURAL;
194130803Smarcel  else if (strncmp (formspec, "binary", len) == 0)
19598944Sobrien    format = FORMAT_BINARY;
196130803Smarcel  else if (strncmp (formspec, "decimal", len) == 0)
19798944Sobrien    format = FORMAT_DECIMAL;
198130803Smarcel  else if (strncmp (formspec, "hexadecimal", len) == 0)
19998944Sobrien    format = FORMAT_HEXADECIMAL;
200130803Smarcel  else if (strncmp (formspec, "octal", len) == 0)
20198944Sobrien    format = FORMAT_OCTAL;
20298944Sobrien  else
20398944Sobrien    error ("mi_cmd_var_set_format: Unknown display format: must be: \"natural\", \"binary\", \"decimal\", \"hexadecimal\", or \"octal\"");
20498944Sobrien
20598944Sobrien  /* Set the format of VAR to given format */
20698944Sobrien  varobj_set_display_format (var, format);
20798944Sobrien
20898944Sobrien  /* Report the new current format */
20998944Sobrien  ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
21098944Sobrien  return MI_CMD_DONE;
21198944Sobrien}
21298944Sobrien
21398944Sobrienenum mi_cmd_result
21498944Sobrienmi_cmd_var_show_format (char *command, char **argv, int argc)
21598944Sobrien{
21698944Sobrien  enum varobj_display_formats format;
21798944Sobrien  struct varobj *var;
21898944Sobrien
21998944Sobrien  if (argc != 1)
22098944Sobrien    error ("mi_cmd_var_show_format: Usage: NAME.");
22198944Sobrien
22298944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
22398944Sobrien  var = varobj_get_handle (argv[0]);
22498944Sobrien  if (var == NULL)
22598944Sobrien    error ("mi_cmd_var_show_format: Variable object not found");
22698944Sobrien
22798944Sobrien  format = varobj_get_display_format (var);
22898944Sobrien
22998944Sobrien  /* Report the current format */
23098944Sobrien  ui_out_field_string (uiout, "format", varobj_format_string[(int) format]);
23198944Sobrien  return MI_CMD_DONE;
23298944Sobrien}
23398944Sobrien
23498944Sobrienenum mi_cmd_result
23598944Sobrienmi_cmd_var_info_num_children (char *command, char **argv, int argc)
23698944Sobrien{
23798944Sobrien  struct varobj *var;
23898944Sobrien
23998944Sobrien  if (argc != 1)
24098944Sobrien    error ("mi_cmd_var_info_num_children: Usage: NAME.");
24198944Sobrien
24298944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
24398944Sobrien  var = varobj_get_handle (argv[0]);
24498944Sobrien  if (var == NULL)
24598944Sobrien    error ("mi_cmd_var_info_num_children: Variable object not found");
24698944Sobrien
24798944Sobrien  ui_out_field_int (uiout, "numchild", varobj_get_num_children (var));
24898944Sobrien  return MI_CMD_DONE;
24998944Sobrien}
25098944Sobrien
25198944Sobrienenum mi_cmd_result
25298944Sobrienmi_cmd_var_list_children (char *command, char **argv, int argc)
25398944Sobrien{
25498944Sobrien  struct varobj *var;
25598944Sobrien  struct varobj **childlist;
25698944Sobrien  struct varobj **cc;
257130803Smarcel  struct cleanup *cleanup_children;
25898944Sobrien  int numchild;
25998944Sobrien  char *type;
260130803Smarcel  enum print_values print_values;
26198944Sobrien
262130803Smarcel  if (argc != 1 && argc != 2)
263130803Smarcel    error ("mi_cmd_var_list_children: Usage: [PRINT_VALUES] NAME");
26498944Sobrien
26598944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
266130803Smarcel  if (argc == 1) var = varobj_get_handle (argv[0]);
267130803Smarcel  else var = varobj_get_handle (argv[1]);
26898944Sobrien  if (var == NULL)
269130803Smarcel    error ("Variable object not found");
27098944Sobrien
27198944Sobrien  numchild = varobj_list_children (var, &childlist);
27298944Sobrien  ui_out_field_int (uiout, "numchild", numchild);
273130803Smarcel  if (argc == 2)
274130803Smarcel    if (strcmp (argv[0], "0") == 0
275130803Smarcel	|| strcmp (argv[0], "--no-values") == 0)
276130803Smarcel      print_values = PRINT_NO_VALUES;
277130803Smarcel    else if (strcmp (argv[0], "1") == 0
278130803Smarcel	     || strcmp (argv[0], "--all-values") == 0)
279130803Smarcel      print_values = PRINT_ALL_VALUES;
280130803Smarcel    else
281130803Smarcel     error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\"");
282130803Smarcel  else print_values = PRINT_NO_VALUES;
28398944Sobrien
28498944Sobrien  if (numchild <= 0)
28598944Sobrien    return MI_CMD_DONE;
28698944Sobrien
287130803Smarcel  if (mi_version (uiout) == 1)
288130803Smarcel    cleanup_children = make_cleanup_ui_out_tuple_begin_end (uiout, "children");
289130803Smarcel  else
290130803Smarcel    cleanup_children = make_cleanup_ui_out_list_begin_end (uiout, "children");
29198944Sobrien  cc = childlist;
29298944Sobrien  while (*cc != NULL)
29398944Sobrien    {
294130803Smarcel      struct cleanup *cleanup_child;
295130803Smarcel      cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, "child");
29698944Sobrien      ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
29798944Sobrien      ui_out_field_string (uiout, "exp", varobj_get_expression (*cc));
29898944Sobrien      ui_out_field_int (uiout, "numchild", varobj_get_num_children (*cc));
299130803Smarcel      if (print_values)
300130803Smarcel	ui_out_field_string (uiout, "value", varobj_get_value (*cc));
30198944Sobrien      type = varobj_get_type (*cc);
30298944Sobrien      /* C++ pseudo-variables (public, private, protected) do not have a type */
30398944Sobrien      if (type)
30498944Sobrien	ui_out_field_string (uiout, "type", varobj_get_type (*cc));
305130803Smarcel      do_cleanups (cleanup_child);
30698944Sobrien      cc++;
30798944Sobrien    }
308130803Smarcel  do_cleanups (cleanup_children);
30998944Sobrien  xfree (childlist);
31098944Sobrien  return MI_CMD_DONE;
31198944Sobrien}
31298944Sobrien
31398944Sobrienenum mi_cmd_result
31498944Sobrienmi_cmd_var_info_type (char *command, char **argv, int argc)
31598944Sobrien{
31698944Sobrien  struct varobj *var;
31798944Sobrien
31898944Sobrien  if (argc != 1)
31998944Sobrien    error ("mi_cmd_var_info_type: Usage: NAME.");
32098944Sobrien
32198944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
32298944Sobrien  var = varobj_get_handle (argv[0]);
32398944Sobrien  if (var == NULL)
32498944Sobrien    error ("mi_cmd_var_info_type: Variable object not found");
32598944Sobrien
32698944Sobrien  ui_out_field_string (uiout, "type", varobj_get_type (var));
32798944Sobrien  return MI_CMD_DONE;
32898944Sobrien}
32998944Sobrien
33098944Sobrienenum mi_cmd_result
33198944Sobrienmi_cmd_var_info_expression (char *command, char **argv, int argc)
33298944Sobrien{
33398944Sobrien  enum varobj_languages lang;
33498944Sobrien  struct varobj *var;
33598944Sobrien
33698944Sobrien  if (argc != 1)
33798944Sobrien    error ("mi_cmd_var_info_expression: Usage: NAME.");
33898944Sobrien
33998944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
34098944Sobrien  var = varobj_get_handle (argv[0]);
34198944Sobrien  if (var == NULL)
34298944Sobrien    error ("mi_cmd_var_info_expression: Variable object not found");
34398944Sobrien
34498944Sobrien  lang = varobj_get_language (var);
34598944Sobrien
34698944Sobrien  ui_out_field_string (uiout, "lang", varobj_language_string[(int) lang]);
34798944Sobrien  ui_out_field_string (uiout, "exp", varobj_get_expression (var));
34898944Sobrien  return MI_CMD_DONE;
34998944Sobrien}
35098944Sobrien
35198944Sobrienenum mi_cmd_result
35298944Sobrienmi_cmd_var_show_attributes (char *command, char **argv, int argc)
35398944Sobrien{
35498944Sobrien  int attr;
35598944Sobrien  char *attstr;
35698944Sobrien  struct varobj *var;
35798944Sobrien
35898944Sobrien  if (argc != 1)
35998944Sobrien    error ("mi_cmd_var_show_attributes: Usage: NAME.");
36098944Sobrien
36198944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
36298944Sobrien  var = varobj_get_handle (argv[0]);
36398944Sobrien  if (var == NULL)
36498944Sobrien    error ("mi_cmd_var_show_attributes: Variable object not found");
36598944Sobrien
36698944Sobrien  attr = varobj_get_attributes (var);
36798944Sobrien  /* FIXME: define masks for attributes */
36898944Sobrien  if (attr & 0x00000001)
36998944Sobrien    attstr = "editable";
37098944Sobrien  else
37198944Sobrien    attstr = "noneditable";
37298944Sobrien
37398944Sobrien  ui_out_field_string (uiout, "attr", attstr);
37498944Sobrien  return MI_CMD_DONE;
37598944Sobrien}
37698944Sobrien
37798944Sobrienenum mi_cmd_result
37898944Sobrienmi_cmd_var_evaluate_expression (char *command, char **argv, int argc)
37998944Sobrien{
38098944Sobrien  struct varobj *var;
38198944Sobrien
38298944Sobrien  if (argc != 1)
38398944Sobrien    error ("mi_cmd_var_evaluate_expression: Usage: NAME.");
38498944Sobrien
38598944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
38698944Sobrien  var = varobj_get_handle (argv[0]);
38798944Sobrien  if (var == NULL)
38898944Sobrien    error ("mi_cmd_var_evaluate_expression: Variable object not found");
38998944Sobrien
39098944Sobrien  ui_out_field_string (uiout, "value", varobj_get_value (var));
39198944Sobrien  return MI_CMD_DONE;
39298944Sobrien}
39398944Sobrien
39498944Sobrienenum mi_cmd_result
39598944Sobrienmi_cmd_var_assign (char *command, char **argv, int argc)
39698944Sobrien{
39798944Sobrien  struct varobj *var;
39898944Sobrien  char *expression;
39998944Sobrien
40098944Sobrien  if (argc != 2)
40198944Sobrien    error ("mi_cmd_var_assign: Usage: NAME EXPRESSION.");
40298944Sobrien
40398944Sobrien  /* Get varobj handle, if a valid var obj name was specified */
40498944Sobrien  var = varobj_get_handle (argv[0]);
40598944Sobrien  if (var == NULL)
40698944Sobrien    error ("mi_cmd_var_assign: Variable object not found");
40798944Sobrien
40898944Sobrien  /* FIXME: define masks for attributes */
40998944Sobrien  if (!(varobj_get_attributes (var) & 0x00000001))
41098944Sobrien    error ("mi_cmd_var_assign: Variable object is not editable");
41198944Sobrien
41298944Sobrien  expression = xstrdup (argv[1]);
41398944Sobrien
41498944Sobrien  if (!varobj_set_value (var, expression))
41598944Sobrien    error ("mi_cmd_var_assign: Could not assign expression to varible object");
41698944Sobrien
41798944Sobrien  ui_out_field_string (uiout, "value", varobj_get_value (var));
41898944Sobrien  return MI_CMD_DONE;
41998944Sobrien}
42098944Sobrien
42198944Sobrienenum mi_cmd_result
42298944Sobrienmi_cmd_var_update (char *command, char **argv, int argc)
42398944Sobrien{
42498944Sobrien  struct varobj *var;
42598944Sobrien  struct varobj **rootlist;
42698944Sobrien  struct varobj **cr;
427130803Smarcel  struct cleanup *cleanup;
42898944Sobrien  char *name;
42998944Sobrien  int nv;
43098944Sobrien
43198944Sobrien  if (argc != 1)
43298944Sobrien    error ("mi_cmd_var_update: Usage: NAME.");
43398944Sobrien
43498944Sobrien  name = argv[0];
43598944Sobrien
43698944Sobrien  /* Check if the parameter is a "*" which means that we want
43798944Sobrien     to update all variables */
43898944Sobrien
43998944Sobrien  if ((*name == '*') && (*(name + 1) == '\0'))
44098944Sobrien    {
44198944Sobrien      nv = varobj_list (&rootlist);
442130803Smarcel      if (mi_version (uiout) <= 1)
443130803Smarcel        cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
444130803Smarcel      else
445130803Smarcel        cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
44698944Sobrien      if (nv <= 0)
44798944Sobrien	{
448130803Smarcel	  do_cleanups (cleanup);
44998944Sobrien	  return MI_CMD_DONE;
45098944Sobrien	}
45198944Sobrien      cr = rootlist;
45298944Sobrien      while (*cr != NULL)
45398944Sobrien	{
45498944Sobrien	  varobj_update_one (*cr);
45598944Sobrien	  cr++;
45698944Sobrien	}
45798944Sobrien      xfree (rootlist);
458130803Smarcel      do_cleanups (cleanup);
45998944Sobrien    }
46098944Sobrien  else
46198944Sobrien    {
46298944Sobrien      /* Get varobj handle, if a valid var obj name was specified */
46398944Sobrien      var = varobj_get_handle (name);
46498944Sobrien      if (var == NULL)
46598944Sobrien	error ("mi_cmd_var_update: Variable object not found");
46698944Sobrien
467130803Smarcel      if (mi_version (uiout) <= 1)
468130803Smarcel        cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist");
469130803Smarcel      else
470130803Smarcel        cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist");
47198944Sobrien      varobj_update_one (var);
472130803Smarcel      do_cleanups (cleanup);
47398944Sobrien    }
47498944Sobrien    return MI_CMD_DONE;
47598944Sobrien}
47698944Sobrien
47798944Sobrien/* Helper for mi_cmd_var_update() Returns 0 if the update for
47898944Sobrien   the variable fails (usually because the variable is out of
47998944Sobrien   scope), and 1 if it succeeds. */
48098944Sobrien
48198944Sobrienstatic int
48298944Sobrienvarobj_update_one (struct varobj *var)
48398944Sobrien{
48498944Sobrien  struct varobj **changelist;
48598944Sobrien  struct varobj **cc;
486130803Smarcel  struct cleanup *cleanup = NULL;
48798944Sobrien  int nc;
48898944Sobrien
48998944Sobrien  nc = varobj_update (&var, &changelist);
49098944Sobrien
49198944Sobrien  /* nc == 0 means that nothing has changed.
49298944Sobrien     nc == -1 means that an error occured in updating the variable.
49398944Sobrien     nc == -2 means the variable has changed type. */
49498944Sobrien
49598944Sobrien  if (nc == 0)
49698944Sobrien    return 1;
49798944Sobrien  else if (nc == -1)
49898944Sobrien    {
499130803Smarcel      if (mi_version (uiout) > 1)
500130803Smarcel        cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
50198944Sobrien      ui_out_field_string (uiout, "name", varobj_get_objname(var));
50298944Sobrien      ui_out_field_string (uiout, "in_scope", "false");
503130803Smarcel      if (mi_version (uiout) > 1)
504130803Smarcel        do_cleanups (cleanup);
50598944Sobrien      return -1;
50698944Sobrien    }
50798944Sobrien  else if (nc == -2)
50898944Sobrien    {
509130803Smarcel      if (mi_version (uiout) > 1)
510130803Smarcel        cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
51198944Sobrien      ui_out_field_string (uiout, "name", varobj_get_objname (var));
51298944Sobrien      ui_out_field_string (uiout, "in_scope", "true");
51398944Sobrien      ui_out_field_string (uiout, "new_type", varobj_get_type(var));
51498944Sobrien      ui_out_field_int (uiout, "new_num_children",
51598944Sobrien			   varobj_get_num_children(var));
516130803Smarcel      if (mi_version (uiout) > 1)
517130803Smarcel        do_cleanups (cleanup);
51898944Sobrien    }
51998944Sobrien  else
52098944Sobrien    {
52198944Sobrien
52298944Sobrien      cc = changelist;
52398944Sobrien      while (*cc != NULL)
52498944Sobrien	{
525130803Smarcel	  if (mi_version (uiout) > 1)
526130803Smarcel	    cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
52798944Sobrien	  ui_out_field_string (uiout, "name", varobj_get_objname (*cc));
52898944Sobrien	  ui_out_field_string (uiout, "in_scope", "true");
52998944Sobrien	  ui_out_field_string (uiout, "type_changed", "false");
530130803Smarcel	  if (mi_version (uiout) > 1)
531130803Smarcel	    do_cleanups (cleanup);
53298944Sobrien	  cc++;
53398944Sobrien	}
53498944Sobrien      xfree (changelist);
53598944Sobrien      return 1;
53698944Sobrien    }
53798944Sobrien  return 1;
53898944Sobrien}
539